利用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组实验。看看这样的标定结果会不会好一些。

 

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Halcon中的9点标定是一种常用的机器视觉标定方法,它可以用于相机的内部和外部参数标定。以下是一个简单的示例代码,演示如何使用Halcon进行9点标定: ```csharp // 读取标定图片 HImage image = new HImage("calib_image.jpg"); HTuple width, height; HOperatorSet.GetImageSize(image, out width, out height); // 定义标定点坐标 HTuple row = new HTuple(); HTuple col = new HTuple(); row = row.TupleConcat(0.3 * height, 0.3 * height, 0.3 * height, 0.7 * height, 0.7 * height, 0.7 * height, 0.5 * height, 0.5 * height, 0.5 * height); col = col.TupleConcat(0.3 * width, 0.5 * width, 0.7 * width, 0.3 * width, 0.5 * width, 0.7 * width, 0.3 * width, 0.5 * width, 0.7 * width); // 进行标定 HTuple cameraParam = new HTuple(); HTuple worldPose = new HTuple(); HOperatorSet.VectorToPose9(row, col, 0, 0, out worldPose); HOperatorSet.FindCalibObject(image, 9, 0, 0.03, "points", out cameraParam); HOperatorSet.CalibrateCameras(image, cameraParam, worldPose, out cameraParam); // 输出相机参数 HTuple fx, fy, cx, cy, kappa, s; HOperatorSet.TupleSelect(cameraParam, 0, out fx); HOperatorSet.TupleSelect(cameraParam, 1, out fy); HOperatorSet.TupleSelect(cameraParam, 2, out cx); HOperatorSet.TupleSelect(cameraParam, 3, out cy); HOperatorSet.TupleSelect(cameraParam, 4, out kappa); HOperatorSet.TupleSelect(cameraParam, 5, out s); Console.WriteLine("fx={0}, fy={1}, cx={2}, cy={3}, kappa={4}, s={5}", fx, fy, cx, cy, kappa, s); ``` 在这个示例中,首先读取标定图片,然后定义标定点的坐标。接着,使用Halcon的FindCalibObject函数找到标定点,并使用CalibrateCameras函数进行标定。最后,通过TupleSelect函数获取相机参数,并输出到控制台。 需要注意的是,在实际应用中,需要使用多组标定图片进行标定,并对标定结果进行评估和优化,才能获得更精确的相机参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值