利用Halcon进行单目标定,及问题小结

 

摄像机标定之前,首先要确定相机和镜头的参数,参考对应说明书,查找IMAGING SOURCE 31BU03相机的参数如下:分辨率1024*768;格式1/3’’;像素尺寸,水平4.65um,垂直4.65um;两个镜头是computar工业自动化镜头,其参数分别是:①焦距5mm,F1.4,尺寸1/2’’,②焦距12mm,F1.4,尺寸2/3’’。相机和镜头参数作为标定过程中算子StartCamPar的初值。

标定过程

首先,创建标定数据模型,使用算子create_calib_data,实例中为create_calib_data ('calibration_object', 1, 1, CalibDataID),该算子是为了创建标定数据模型,即标定的数据将存放于CalibDataID中。

其次,设定摄像机的初始化参数,即第一段所提及。算子为set_calib_data_cam_param  (CalibDataID, 0, 'area_scan_division', StartCamPar)。

第三步,描述标定板,,这里标定板名称CaltabName有两种途径获取,使用算子set_calib_data_calib_object (CalibDataID, 0,CaltabName)。一种途径是直接调用Halcon自带的描述文件(.descr),另一种是通过算子gen_caltab自制标定板,产生描述文件。标定板描述文件中的标定板信息必须与标定过程中使用的标定板规格、尺寸一致。

第四步,开始标定。其中又分为两部分,一是找到标定板,二是找到标定点及其位置。使用算子为find_caltab (Image, Caltab, CaltabName, SizeGauss,MarkThresh, MinDiamMarks) 和find_marks_and_pose (Image, Caltab,CaltabName, StartCamPar, StartThresh, DeltaThresh, MinThresh, Alpha,MinContLength, MaxDiamMarks, RCoord, CCoord, StartPose)。标定板上各个标定点的图像座标信息存储在Rcoord和 Ccoord中。

第五步,标定,利用算子camera_calibration执行相机标定。

第六步,输出标定结果。通过算子get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam),将摄像机内参存储在CamParam中,通过write_cam_par()将内参写出。

确定相机外参

确定相机外参是摄像机标定的重要内容,有了外参,才能实现CCS(camera coordinate system)与WCS(world coordinate system)之间的座标转换。而外参是无法直接获取,确定外参有以下几种不同的方法:

1、当标定板在测量平面上时,默认测量平面在WCS座标系xoy面上,且z=0,此时,直接调用get_calib_data  (CalibDataID, 'calib_obj_pose', [0, NumImage],'pose', Pose)即可得到摄像机外参Pose。

2、将内参标定和外参标定单独处理进行,在通过上述标定获取内参之后,单独拍摄一幅图片,该图片与上述1中位置一致,再次利用find_caltab 和find_marks_and_pose,然后利用camera_ calibration进行标定。

3、自己确定WCS中某些点的座标以及它们投影在图像中的座标。然后调用函数vector_to_pose确定对应。

问题:1、外参的确定是相对的吗,像外参标定中第一、二种方法,测量平面是怎么确定的,是与摄像机座标系(Xc,Yc,Zc)对应,各轴平行的世界座标系上的XwOYw平面吗?外参数是你标定模板的座标系相对于摄像机座标系的pose

即摄像机座标系通过旋转一定角度(旋转矢量),再平移一定值(平移矢量)就可以变为标定模板的座标系。

标定模板的座标系,是已一个角上的黑点定义为原点,x轴、y轴在标定模板平面内,z轴垂直于标定模板平面。

 

2、通过第一种方法get_calib_data  (CalibDataID,'calib_obj_pose', [0, NumImage], 'pose', Pose)获取的Pose是平移和旋转向量,如下图左一;通过第二种方法获得的结果为中间图;而通过第三种方法获取的结果为右1。

这三个结果是Halcon自带程序结果\MVTec\HALCON-10.0\examples\solution_guide \3d_vision\中的camera_calibration_multi_image.hdev(图一结果),camera_calibration_exterior.hdev(图二和图三结果)。怎样的外参为合理结果。

第三种因为哦我没有camera_calibration_multi_image.hdev这个程序,所以我不清楚具体是什么。但第一种和第二种方法获得的应该是一致的,应该是对的。建议你不要用什么标定助手,用halcon自带的以前的calibration相关的例程,然后看看halcon的基本手册,讲pose的,将标定的。

 

3、标定的内参结果,初始分辨率是1024*768,得到的Cx和Cy,应该是图像宽度和高度的一半,也就是在512,384左右,实际标定结果偏差较大,多次不同实验结果相近,不知道问题出在哪里。

CxCy这个结果应该是差不多可靠的,因为看你5mm12mm标定的结果CxCy差不多,这个与512384中间值相差大是正常的,镜头的中心由于安装的原因也不一定就与512384中间值同轴,而且因为标定的模型是小孔成像理论情况,而实际的lens不是理想凸透镜,不是单光心的,所有CxCy会有变化,畸变参数的变化误差更大。

但我看了你的标定图像,里面有个最大的bug就是,你的标定模板不是平的,没有固定好,那时候我让本科生用玻璃鼠标垫上固定标定模板,做实验是有目的,这样能最大减少误差。所以看了你的一些实验照片,我基本上对你的实验结果打很多的问号的?

我很奇怪你为什么做实验的时候没有用原来的玻璃鼠标垫?建议你用不干胶粘贴标定模板后,用书压一晚上,压平之后重新做2-3组实验。看看这样的标定结果会不会好一些。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章