OpenCV机器⼈⼿眼标定(九点标定法)
手眼 对于初学者⽽⾔,对相机的标定经常模糊不清。不知道机器坐标与相机坐标如何转换,两个坐标系⼜是如何建⽴?
我们通常是利⽤张⽒标定法,针对于相机的畸变进⾏标定,利⽤校正得到的参数对图形进⾏处理后再呈现出来。这个⽅法⽹上⽤的⼈很多,资料也较为全⾯。这⾥就不做说明了。本⽂主要是针对机械⼿的⼿眼标定,⼀般⽽⾔⽬前相机的畸变较⼩,精度也较为准确,使⽤该⽅法进⾏标定也能得到较好的效果。
⾸先,对于九点标定⽽⾔。我们使⽤到的是OpenCv中的estimateRigidTransform 函数。
函数定义如下:
Mat estimateRigidTransform(InputArraysrc,InputArraydst,boolfullAffine)
前两个参数,可以是:src=srcImage (变换之前的图⽚Mat) dst=transImage(变换之后的图⽚Mat)
也可以: src=array(变换之前的关键点Array) dst=array(变换之后的关键点Array)
第三个参数: 1(全仿射变换,包括:rotation, translation, scaling,shearing,reflection)
其主要原理为:如果我们有⼀个点变换之前是[x,y,1],变换后是[x’,y’,1] 则fullAffine表⽰如下:
TX=Y
展开后表⽰
如果我们想求这【a-f】 6个变量需要有6个⽅程,也就是3组点。但是⽐三个点多呢?
⽐如:20个点。那就是⽤最⼩⽅差。
标定步骤
1、⾸先我们需要准备⼀块,标定板。如果条件不⾜,可以使⽤⽩纸画上九个圆进⾏代替。
2、相机位置,机械⼿位置全部固定好,标定针固定在机械⼿上,固定好后不能够再移动。标定针的位置⼀定要与夹⼿或吸盘之内的⼯具同⼀位置⾼度。
3、将标定板放到相机下⽅,位置区域要与机械⼿⼯作的区域⼀样,包括⾼度必须尽量⼀致,这是标定准确度的关键。
4、调整好相机焦距,拍照,然后识别9个圆圆⼼的坐标并进⾏记录。关于如何圆,可以参考我的上⼀篇博⽂,对于圆形的查⼗分精准。
5、将机械⼿依次移动到9个圆的圆⼼位置,记下机械⼿坐标
做完以上五步,我们会得到两个点集。⼀个为9个圆圆⼼坐标(points_camera),⼀个为9个圆⼼对应的机械⼿坐标(points_robot)。
1 Mat warpMat;
2 vector<Point2f>points_camera;
3 vector<Point2f>points_robot;`
4 vector<Point2f>points_camera;
5 vector<Point2f>points_robot;
6 warpMat =estimateRigidTransform(points_camera, points_robot, true);
7 A = warpMat.ptr<double>(0)[0];
8 B = warpMat.ptr<double>(0)[1];
9 C = warpMat.ptr<double>(0)[2];
10 D = warpMat.ptr<double>(1)[0];
11 E = warpMat.ptr<double>(1)[1];
12 F = warpMat.ptr<double>(1)[2];
得出来的6个double类型的参数,就是我们此次标定最终得到的标定参数了。
之后我们把检测得到的图像坐标(t_px,t_py)代⼊,就可以得到与之相对应的机械⼿坐标(t_rx,t_ry)
t_rx= (A * t_px) + B * t_py + C);
t_ry= (D * t_px) + E * t_py+ F);
⾄此标定结束,我们可以控制相机拍照进⾏定位,然后转换成机械⼿坐标,指哪打哪了。
发布评论