OpenCV相机标定坐标系详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenCV相机标定坐标系详解
在OpenCV中,可以使⽤calibrateCamera函数,通过多个视⾓的2D/3D对应,求解出该相机的内参数和每⼀个视⾓的外参数。
使⽤C++接⼝时的输⼊参数如下:
objectPoints - 每⼀个视⾓中,关键点的世界坐标系。
可以使⽤vector < vector <Point3f> >类型,第⼀层vector表⽰每⼀个视⾓,第⼆层vector表⽰每⼀个点。
如果使⽤OpenCV⾃带的棋盘格,可以直接传⼊交叉点(不包括边⾓)的实际坐标,以物理世界尺度(例如毫⽶)为单位。
写坐标时,要保证z轴为0,按照先x变化,后y变化,从⼩到⼤的顺序来写。
如果⽹格尺⼨为5厘⽶,写作:(0,0,0),(5,0,0), (10,0,0)...(0,5,0), (5,5,0), (10,5,0),...
如下图例⼦,x⽅向是8个交叉点,y⽅向3个较差点。
imagePoints - 每⼀个视⾓中,关键点的图像坐标系。
可以使⽤vector < vector <Point2f> >类型。
这个值可以通过findChessboardCorners函数从图像中获得。
注意:传⼊findChessboardCorners函数的patternSize参数,要和objectPoints 中的⾏列数统⼀。
imageSize - 图像尺⼨。
flags - 参数。
决定是否使⽤初始值,扭曲参数个数等。
输出参数如下:
cameraMatrix - 3*3的摄像机内矩阵。
distCoeffs - 4*1(具体尺⼨取决于flags)。
对图像坐标系进⾏进⼀步扭曲。
这两个参数是内参数,可以把摄像机坐标系转换成图像坐标系。
rvecs - 每⼀个视图的旋转向量。
vector<Mat>类型,每个vec为3*1,可以⽤Rodrigues函数转换为3*3的旋转矩阵。
tvecs - 每⼀个视图的平移向量。
vector<Mat>类型,每个vec为3*1。
这两个参数是外参数,每⼀个视图不同,可以把世界坐标系转换成摄像机坐标系。
* 在2.10⽂档中,写的是from the model coordinate space (in which object points are specificed) to the world coordinate space。
提到model 容易引起歧义。
看到这⾥,问题来了:这个世界坐标系是什么样的?
在objectPoints中,我们实际只设定了每个交叉点的间隔,具体xyz指向哪⾥却没有给出。
这时候,需要使⽤drawChessboardCorners函数,把检测到的2D点在原图上显⽰出来:
这个函数按照先变化x,⽽后变化y的⽅式依次画点。
先画的⾏为红⾊,逐渐变为蓝⾊。
回顾我们写objectPoints时的⽅式,可以推断出世界坐标的⽅向:图中x轴正⽅向向左,y轴正⽅向远离镜头,根据右⼿螺旋,z轴正⽅向向下。
总结来说,calibrateCamera函数给出的世界坐标⽅向,是由obejctPoints的设定顺序,以及findChessboardCorners的检测顺序共同决定的。
但是,findChessboardCorners先检测那个⾓点并不确定。
前例从右下⾓开始,以下就从左上⾓开始:
另⼀种常见⽤法是:先⽤calibrateCamera标定好摄像机内参,⽽后使⽤solvePnP函数只求解外参。
solvePnP函数的参数意义和calibrateCamera类似。