halcon面阵相机标定矫正

使用标定助手标定过程很简单就不赘述了,可以自行查找,无非就是生成描述文件=>填写相机像元参数,镜头参数,标定板参数=>拍照=>标定即可

例如标定后得到的参数为
相机内参 => CameraParameters := [0.0130131,-2255.9,2.00077e-006,2e-006,1263.13,1031.32,2592,1944]
相机外参 => CameraPose := [-0.0111166,-0.00766521,0.117412,0.570424,359.157,82.3899,0]

相机内参如果深究起来需要理解矩阵的一些知识,网络上也有很多大神详细的讲解如何根据标定图像来求解内参,归根结底目的是矫正径向畸变也就是所谓的桶形畸变和枕形畸变,简单理解就是让实际物体的直线在图像上看来仍然是一条直线而不是曲线。对于这个相机外参一直不是很理解,网络上无非说是相机位姿,但是做什么用的不是很懂,还有为什么标定的时候需要选择一个参考位姿的图片呢?带着这个疑问查询了很多资料,终于搞明白了一些。

首先相机标定存在三个坐标系分别是 世界坐标,相机坐标,图像坐标。世界坐标就是真实世界中的物理坐标可以自定义比如我们定义标定板的正中心的黑色圆点的圆心作为原点,垂直标定板向上为z轴建立笛卡尔坐标系O-xyz单位可以设为mm。相机坐标系其实是以镜头中心为原点,光路为z轴的一个笛卡尔坐标系O1-x1y1z1。这两个坐标系之间的变换是一种刚体变换,也就是说保持三个坐标轴的直角关系不变通过在三维空间中的旋转,平移即可使得两个坐标轴完全重合到一起,那么世界坐标系分别绕着xyz轴旋转多少度,然后原点再沿xyz轴平移多少mm两个坐标系就可以重合了呢,这就是我们标定得到的相机外参来描述的比如上面的外参为CameraPose := [-0.0111166,-0.00766521,0.117412,0.570424,359.157,82.3899,0],前三个参数就是表示以世界坐标系为参考沿x轴平移-0.0111166m,沿y轴平移-0.00766521m,沿z轴平移0.117412m这两个坐标系的原点即可重合,注意单位是m(米)。然后再分别绕xyz轴旋转0.570424度,359.157度,82.3899度两个坐标系的xyz轴即可重合。这就是相机外参的意义所在,为什么叫位姿,其实就是描述相机相对于标定板的拍摄姿态是怎么样的,是从哪个角度来拍摄标定板图像的,只有知道这个参数才能将拍摄的标定板图像转换成z=0的视角图像(也就是xOy平面,理想的垂直标定板拍摄角度)。在标定助手里面可以设置不同标定板图像为参考位姿,标定出来的相机外参是不同的,这也不难理解,因为使用不同的标定板作为参考位姿如果想讲这个标定板图像转换成z=0的视角拍摄的图像相机需要调整的角度是不同的。

得到相机内外参数后如果需要测量需要将原始图片通过内外参数映射才能进行测量真实长度。

左侧图像是标定的时候通过标定助手选择的作为参考位姿的标定板图像,右侧是这幅图像转换成相机从正上方垂直拍摄的无畸变的理想图像,代码如下所示

*相机标定得到的相机内参和外参
CameraParameters := [0.0130131,-2255.9,2.00077e-006,2e-006,1263.13,1031.32,2592,1944]
CameraPose := [-0.0111166,-0.00766521,0.117412,0.570424,359.157,82.3899,0]
*读取作为参考位姿的标定板图像
read_image (Image, 'F:/Desktop/halcontest/Images/20210121-220543-844.bmp')
*这里为什么是40,其实这里40表示的是40mm,后面除以1000是换算成0.040m
realViewWidth := 40
*将mm单位换算成m为单位,表示我想转换后的图片显示0.039m宽的视野
realViewWidth := realViewWidth / 1000.0 
*这里是重新设置相机位姿,表示将相机的拍摄角度沿原点沿xyz分别平移多少m,可以将转换后的图像平移到视野中心,注意这里实际可以理解为移动的是相机而不是标定板
*这也解释了为什么上图往中心移动是负数而不是正数,标定板边框处的小三角是在OXY平面的第三象限处,原点O是在标定板正中心位置
set_origin_pose (CameraPose, -0.5*realViewWidth, -0.4*realViewWidth, 0, newCameraPose)
*生成映射图,将像素为单位的图像转换成实际长度单位。这里需要着重说一下这几个参数
*MapImage[out]:输出得到的映射图
*CameraParameters[in]:标定得到的相机内参
*newCameraPose[in]:在标定得到的相机外参基础上重新调整得到新的相机外参
*2592[in]:输入像素为单位的图像宽度
*1944[in]:输入像素为单位的图像高度
*2592[in]:输出图像的像素宽度
*1944[in]:输出图像的像素高度
*realViewWidth / 2592[in]:非常重要的参数,表示转换后的图像每个像素代表真实的物理距离,单位为m。输出图像的宽度高度和每个
*像素代表的实际长度决定了映射后的图像标定板在图像中的大小。因为如果同为2592*1944大小的图像,标定板所占比例大小在每个像素代表0.001m的图像中肯定要大于每个像素代表0.002m
*的图像比例。如果长为0.002m的直尺在比例为0.001m的图像中占2个像素,但是在比例为0.002m的图像中只占1个像素。
gen_image_to_world_plane_map (MapImage, CameraParameters, newCameraPose, 2592, 1944, 2592, 1944, realViewWidth / 2592, 'bilinear')
* Calibration 01: Now, images can be rectified using the rectification map
map_image (Image, MapImage, RealWordImage)

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值