相机标定个人总结.docx
《相机标定个人总结.docx》由会员分享,可在线阅读,更多相关《相机标定个人总结.docx(18页珍藏版)》请在冰豆网上搜索。
![相机标定个人总结.docx](https://file1.bdocx.com/fileroot1/2023-1/23/62da9486-821b-4183-997c-5d254232f232/62da9486-821b-4183-997c-5d254232f2321.gif)
相机标定个人总结
本文是一篇关于相机标左意义和原理的个人总结,包含了OpenCV和Matlab中常用的相机标定函数的注解。
相机标左是机器视觉的基础,标龙结果的好坏直接决定了机器视觉的系统精度,作用可见一斑。
在这一年半的时间里,我个人也是随着实验和程序的进一步理解,对标定的原理和意义有了更多的想法。
同样,由于博文的关系,仍有一些朋友会常常询问标立的程序问题。
本人的2020-05-170penCV标足程序的问题也多次被朋友询问,由于当时对标左的认识还不够系统,因此现在认为该文对标左的意义和原理有很多误解,并在此推荐一些较好的博文拱大家学习:
双目测距与三维重建的0penCV实现问题集锦
(一)图像获取与单目标定;
双目测距与三维重建的OpenCV实现问题集锦
(二)双目标左与双目校正;
双摄像头测距的OpenCV实现:
分享一些OpenCV实现立体视觉的经验:
下而结合本人的毕业论文及一年半来对机器视觉的学习,对相机标左的意义和原理进行叙述。
1.单目相机模型
单目相机模型中的三种坐标系关系如图1所示,相机坐标系即是以光轴中心0为原点的坐标系,其z轴满足右手法则,成像原点O,所代表平而即为像平面坐标系(实际应用中,均以图像左上角为坐标系原点),实际物体坐标系即为世界坐标系。
其中,P在世界坐标系的值为(Xw,Yw.Zw),P“是P在像平面坐标系的投影点,英相机坐标系的值为(X“.Y“.乙)。
0是相机坐标系Z轴与像平而夹角,一般情况下Z轴与像平而垂直,0值为%。
且相机坐标系AOy与像平而yO/丹平行,/为相机的焦距。
(1)
(2):
对于从相机坐标系到像平面坐标系的变换,像平而坐标系是用像素单位来表示的,而相机坐标系则是以亳米为单位来表示,因此.要完成改变换过程就需要先得到像平而的像素单位与亳米单位之间的线性关系。
在图1中,相机光轴中心Z轴方向上与像平面的交点O称为投影中心,坐标为(c、,cy),是像素单位,而每个像素在和匕的物理尺寸为s,=ydx和S,=%、.,单位是像素/亳米,则像平而的像素与亳米间的线性关系如式
(1):
/、
11
V
=
f
0
0L
/\
X
y
丄
0
01丿
丄
根据小孔模型下投影变换原理,像平而的物理坐标(儿y)对应的相机坐标系满足式
(2)
'=丿Z“sin&
其对应的矩阵形式为式(3):
联立式
(1)和式(3),得到式(4)即为相机坐标系与像平而坐标系变换的矩阵。
摄像机坐标系
:
£・/&即为相机的6个内参数,其组成的矩阵即为内参数矩阵。
对于从相机坐标系到世界坐标系的变换,是通过旋转矩阵R和平移矩阵T完成的,如图
P.(\.YrZ.)
图2相机坐标系与世界坐标系的变换关系
英中,平移矩阵T是三维列向虽:
,旋转矩阵R是坐标轴依次绕和z轴旋转角度04
(5)
和『所形成的三个矩阵农(肖)尺@)冬(厂)的总乘积。
它们的定义如式(5):
f\
0
0
Rv(^)=
0cos©
sin©
0・sin0
COS0,
cos00
■sin©
R,@)=
0
1
0
sin(p0
cos(p,
cosrsinr0
R.(r)=・sinrcosr0
001,
则矩阵R的计算公式如式(6):
因此,从相机坐标系到世界坐标系的变换如式(7),其中,Qi表示(000),R®
(8):
/\u
(sj
一/cosSJ
o'
/
\
xj
V
1
=
0
/sin"J0cv
0
Rg
Yw
z
[丿y
oT
1
Zw
丄
w
0
01
0
\
/
1
[
其中,
Mg即为透视投影矩阵,表示空间中三维点坐标与图像平而二维坐标之间的线性关
系,(“v1/表示匕的像平而齐次坐标值,(X*YwZw1)T表示P的世界坐标系齐次坐
标值。
基于以上几何原理和相机模型得到的图像信息和三维信息之间的关系,存在不可逆性,即可以通过已知世界坐标系的坐标值求得二维坐标值,如果要进行二维坐标到三维坐标的反求还需要其他的数学模型辅助求解。
2.Matlab标定工具箱应用
1)制作标泄板,标左板尺寸为324(nun)X252(mm),即7行9列63个36mm的正方形方格组成,如图3所示。
2)将水平平行的左右相机同时采集标圧板的不同位姿图像,共计12组位姿(对于采集的
图像,位姿越多,标左结果也会越精确,建议在10组到20组之间)如图4,5所示。
图4左相机的标立图像
图5右相机的标立图像
3)在工具箱中通过Extractgridcorners提取每幅标泄图像的特征点(即黑方格与白方格的交点)。
4)进行单目标立,得到左右相机的内外参数以及畸变系数,并将参数保存到
Cal让_Results_left和Calib_Results_right两个mat格式的文件中。
3.Matlab标定结果与OpenCV标左结果的比较与分析
Matlab标定结果:
通过上节的步骤
(1)-(4),可以得到如图6和7所示的左右相机的内参数、畸
变系数结果。
Calibrationresults(vrithunceftcdrrties):
FocalLciuth:
fc=[B54.32776B58.B0255]?
〔57.3377257.8^4301
Principalpoint:
cc=[29L15519236.24060]?
[11.554396.33Q77]
Skev:
alpha_c=[0.00000][0.QOOOQ]=>anglea£pixelaxes=90.00000^0.00000degrees
Distortion:
kc=[0.08416-0.22269-0.001360.0015】0.00000]?
C0.027470.1^4000.002260.002950.00000]
Pixelerroi:
:
err=[0.331510.2362B]
图6左相机的内参数和畸变系数
Calibrationresults(uriihuncertamtiex):
FocalLength:
Principalpoint:
fc=[321.T1021824.98870]?
[56.0310056.06327]
cc=[311.147G1244.35410J?
[7.995936.8^832]
Skeur:
Distortion:
PlxgIerror:
alpha^c=[0.00000][0.00000]=>auxgleofpLxelaxes=90.00000^0.00000degrees
kc=[0.027920.04452-0.001270.002760.000001X0.034H0.2705b0.001930.003440.00000]
err=[0.313-390.26350]
图7右相机的内参数和畸变系数
对于左右相机山于透镜畸变造成的误差使用工具箱中的visualize_distortions功能进行分析,可以得到左相机的畸变图,如8、9、10所示,相应的右相机畸变图,如11、12、13所示。
CompleteDistortionModel
0100200300
400
5006.00
Pixelerror
=[0.3315,0.28&2]
FocalLength
=(854328,858.803)
♦/-[57.34,57.84]
PrincipalPoint
=(291.15%236,241)
+/-[H-55>6.835]
Sk«w
=0
+/-0
Radialcoefficients
=(0.08416,-02227^0)
+/"[0.02747,0.144^0]
Tangentialcoefficients
=(-0.001357^0.00151)
-*•/-[0.002255,0.0029471
图8左相机镜头畸变图
RadialComponentoftheDistortionModel
o
50
100
150
200
250
300
350
400
450
0
100200300
400
500600
Pixelerror
=[0.3315,0.2863]
Foc^lLength
=(854.328,858.803)
+/-[57.34z57.84]
PrincipalPoint
=(291.155,236.241)
4-/-[11.55?
G.835]
Skew
=0
叶Q
Radialcoefficients
=(0.0841E.,-0.2227.0)
+/-[0.02747,0.144,0]
Tnnqentialcoefficients
=(-0.001357;0.00151)
*•/-[0.002255,0.002947]
图9左相机径向畸变图
TangentialComponentoftheDistortionModel
图像在此则不易受畸变因素影响造成线条的弯曲;图9左相机径向畸变模型中,
0
100200?
00
400
500600
Pixelerror
=[03135,0.2635]
FocalLength
=(821.7b824•弼)
+/■[56.03,56.06.]
PrincipalPoint
=(311.14$,244.354)
+/-[7.996,6.848]
Skew
=0
*•0
Radialcoeflficients
=(0.02792,0.04452『0)
+/-[0.03411,0.2706,0]
Tangentialcoefficients
=(-0.001265,0.002762)
+/•[0.00193b0.002442]
图12右相机径向畸变图
Pixelerror=[0.5135,0.2635]
FociLength=(821.7b824・98勺)叶[56.03,56.06]
PrincipalPoint=(311.145,244.354)+卜[7.^6.S4S]
Skew=0+/■0
Radialcoefficients=(0.02732,0.0445乙0)+/-[0.03411?
0.2706-,0]
Tangentialcoefficients=(-0.00126-5.0.002762)+/-[0.001331,0.002442]
图13右相机切向畸变图
对于图□到13,图中的0点与左相机相同,即为右相机光学中心,图中的箭头显示相机图像的畸变方向。
图□右相机整体畸变模型中,该相机的中间及偏左侧畸变不明显,若物体的图像在此则不易受畸变因素影响造成线条的弯曲;图12右相机径向畸变模型中,该相机的畸变系数III中心向外增大,但右相机比左相机在光轴中心附近有更大的区域畸变很小,因此位于右侧相机光学中心的图像,其线条因受畸变造成的弯曲很小;图13右相机切向畸变模型中,箭头方向显示该相机切向畸变的增大方向,在相机的左侧其切向畸变与径向畸变的方向相反,使得整体畸变模型中,位于右相机图像左侧的线条受畸变影响较小。
OpenCV标左结果:
在此列举的OpenCV标左结果是我双目视觉标泄且优化后的结果,与Matlab的会有差异。
左侧相机的内参数矩阵:
‘837.62931
0
301.0371、
0
840.95381
238.93799
(9)
0
0
1」
右侧相机的内参数矩阵:
该式(9)-(10)与式
(1)相对应。
而Matlab中的cc对应于式
(1)中的相机光轴中心在图像平而的投影坐标,fc即为式
(1)中的H和片。
至此,讲解完了OpenCV与Matlab所对应的相机标立内参数矩阵的含义。
OpenCV与Matlab标定中的差异:
OpenCV的标左参数中,对于镜头畸变采用的方法是Brown博士在71年发表的文章中提到的:
而Matlab中的镜头畸变参数采用基于Heikkil提岀的方法,将非线性干扰因素
引入到内外参数的求解过程。
Heikkil采用5x1的矩阵(/k2从p2他)来表示以上的两种畸变系数。
根据Brown的非线性模型,込和心表示镜头的径向畸变系数,通常只使用心,込两项,妇只是针对即便较大的镜头(例如鱼眼镜头,英余情况下该系数值为0),而厲和$表示切向畸变系数,由式(11)和式(12)求解该矩阵,本文的畸变系数求解伴随在相机标泄过程中。
也冋=・工(1+£]尸+k2r'+V6)
,(11)畑cm(1+M2+3*+❻")
tangential『+血(^+")]
(12)
其中,(忑刃是像平而上的任一点坐标值,(兀说斶)是进行径向畸变娇正后的坐标值,r2,r\r6是r作为光学中心畸变为0的点进行泰勒级数展开后得到的。
J(angenlia]=y+[A”+2尸)+2时]
其中,(忑刃是像平面上的任一点坐标值,(沧现计治小诟J是进行切向畸变矫正后的坐标值,r2,r4,r6如式(11)的進义相同。
4.外参数的作用及其在相机标定中的意义
外参数左义了如图2所示的图像平而到世界坐标系的变换关系匚而标宦就是通过相机寻找图像平面中如图3所示的标左板的特征点位置,所以得到的外参数是图像平而与标怎板所处平而的线性变换关系。
在我的2010-06-14基于血tlab的双目视觉左位问题研究中,通过Matlab标定工具箱产生的图4与图5就可以表达上述含义。
图3图4图5
因此,对于不同的棋盘格标左板空间位宜,必然对应于不同的外参数矩阵。
同样的,在视觉伺服中.雅可比矩阵也有同样的数学意义。
对于视觉伺服•个人认为可以看些徐徳的论文入门。
5.OpenCV标左程序说明
用于寻找图像中的棋盘格标怎板的特征点:
CvSizeboard.sz=cvSize(board_w,board_h);
Ipllmage*imgLcft=cvCrcateImage(cvSize(iingL->width.iingL->height),imgL->depth.iingL->nChannels);
Ipllmage♦imgRight=cvCreateImage(cvSize(imgR->widthjmgR->hcight)jmgR->depth,imgR->nChannels);
CvPoint2D32f*cornersLeft=newCvPoint2D32f[board_n];
CvPoint2D32f*cornersRight=newCvPoint2D32f[board_n];
intcomer_countLcft,corner_countRight;
cvResize(imgL,imgLeft,CV_INTER_LINEAR);cvResize(imgRJmgRight,CVJNTER_LINEAR);
if(frame++%board_dt==0){
//Findchessboardcorners:
intfoundLeft=cvFindChessboardCorners(
imgLeft,board_sz.cornersLeft・&comer_countLeft,
CVCALIBCBADAPTIVETHRESHICVCALIBCBFILTERQUADS);
intfoundRight=cvFindChessboardCorners(
imgRight,board_sz,cornersRight,&corner_countRight,
CVCALIBCBADAPTIVETHRESHICVCALIBCBFILTERQUADS);
//GetSubpixelaccuracyonthosecorners
cvCvtColor(imgLeft,grayLeft,CV_BGR2GRAY);//ifinputiscolorfulthenusethiscvCvtColor(imgRight,grayRight,CV_BGR2GRAY);
//cvCopy(image1.grayJmage1);
//cvCopy(image2,grayjmage2);
cvFindCornerSubPix(grayLeft,cornersLeft,corner_countLeft,cvSize(lLll)xvSize(-1r1),
cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRITJTER,30.0.1));//寻找棋盘格标定板的特征点
cvFindCornerSubPix(grayRight,cornersRight,corner^countRight,cvSize(l1J1),cvSize(-1厂1),
cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRITJTER.30,0.1));〃寻找棋盘格标定板的特征点
〃画出找到的特征点cvDrawChessboardCorncrs(imgLeft,board_sz,cornersLeft,corner_countLeft,foundLeft);
cvDrawChessboardCorners(imgRight,board_sz,cornersRight,corner_countRight,foundRight);
if(corner_countLeft>=board_n&&foundLeft&&corner-countRight>=board_n&&foundRight)
{〃保存特征点在图像坐标中的坐标值,用于Calibrate2和StcrcoCalibralion的调用step=success*board_n;
for(inti=step,j=0;jCV_MAT_ELEM(*image_pointsLcft,float,i90)=cornersLeft[j].x;CV_MAT_ELEM(*image_pointsLeft,float,i,l)=comersLeft[j].y;CV_MAT_ELEM(*image_pointsRight,float,i,0)=cornersRight[j].x;CV_MAT_ELEM(*image_pointsRight,floatJJ)=cornersRight[j].y;CV_MAT_ELEM(*object_points,float,i,0)=(float)(j/board_w);CV_MAT_ELEM(*object_points,float,i,1)=(float)(j%board_w);CV_MAT_ELEM(*object_points?
float42)=O.Of;
}
CV_MAT_ELEM(*point_counts,int,success,0)=board_n;
}
}
随后调用cvCal让ateCame:
ra2和cvStereoCalibate函数进行相机的标左。
标定的例程可以参考Learning0penCV«
以下推荐两本OpenCV的参考书:
学习OpenCV(中文版)于仕琪译淸华大学出版社,2009:
(OpenCV2・0库)
基于OpenCV的计算机视觉技术实现陈胜勇,刘盛编著科学岀版社,2008:
(OpenCV1.0库)opencv・org・cn中文论坛
希望这篇总结对于各位有所帮助。