这几天一直在搞相机的标定。过程中遇到了许许多多的问题,为了让广大自动化行业的小白避免踩坑,用这个帖子总结一下相机的标定。接下来我就给大家介绍一下标定,侧重点在怎么做。
首先镜头有畸变,也就是说照出的图像与实际不符产生了形变。即使号称无畸变的工业镜头也是有千分之几的畸变率的。上个图告诉大家畸变
这个图里,第一个图就是我们相机下的真实的形状,后边两个就是照出来有畸变的图片。
其次镜头与相机无论你的机械结构精度多高,也不容易或者说没办法将相机安装的特别正,那相机安装不正也是会导致误差的。大家想知道具体数学模型的话可以搜一下相机标定的理论方面的知识,我侧重怎么做。
标定就是把上述两个东西转化成正常的。
首先相机连接电脑,打开halcon,连接相机(这里不一定要连接相机,用相机照好的图片也可以)。
这里说一下halcon连接相机,一般的相机都能用halcon连接,做标定很方便。给大家展示一下连接步骤。
1框内是检查相机是否能够索引到,2框是看是否有图像,3框是检查帧率与带宽相机尺寸,4框是检查有无错误信息。
如果正常,用相机厂家软件关闭相机并且断开连接(这很重要,要不halcon连不上相机),记住停止采集不代表断开连接!!!
把相机固定好
点击助手,点击打开新的ImageAcquisition。
选择图像获取接口,点击自动检测检测相机类型。后边的文本框里会显示相机类型,我的是千兆网相机,所以显示GigeVision。前边大家用相机厂家的软件打开了相机,那么说明大家都安装了相机厂家halcon连接的sdk,所以接口是可以检测到的,如果没安装相机厂家的软件要安装哦,不然连接不上。有啥不懂留言问我。
切换资源窗口到连接窗口
1就是咱们安装相机厂家软件之后的相机采集SDK包。
2选择你要连接的设备
3点击连接连接相机(如果有其他程序连着现在的相机,halcon是没办法连接上的,所以上边让大家记得断开连接)
4点击实时,实时显示图像
连接上相机并实时显示
1图像显示区域
2断开相机连接
3停止实时采集
进行完上述设置后停止实时采集,关闭ImageAcquisition窗口,不用保存,因为只要我们不关闭halcon这个图像采集ImageAcquisition01都可以在助手里边找到。
这个文件是描述你的标定板尺寸的,有了这个文件,halcon才知道你的标定板是多大的。
怎么生成呢,很简单
为了让大家方便复制,我把代码贴出来:
gen_caltab (7, 7, 0.004, 0.5, ‘C:/Users/Administrator/Desktop/caltab.descr’, ‘C:/Users/Administrator/Desktop/caltab.ps’)
关于gen_caltab 算子详细解释传送门点击即可查看gen_caltab 解释
点击助手,点击打开新的Calibration。
在安装界面
1标定任务选择全标定,内外参数全部标定。
2.标定板的描述文件选择我们刚刚创建的描述文件。C:/Users/Administrator/Desktop/caltab.descr
厚度的话就填写标定板厚度
3.摄像机参数
选择摄像机模型,我的是面阵相机。镜头是远心镜头就选择远心
4.像元的宽高填写相机的像元尺寸,如果不知道去问相机厂家。焦距填写镜头的焦距。
确保以上内容填写正确!!!!
我的填写好后:
接下来切换到标定栏,
1图像源选择图相采集助手
2点击这个显示图相采集助手按钮显示图像采集窗口
3点击连接连接相机,点击实时显示图像
4点击图像采集助手里的参数,调整焦距,调整光源,让成像质量好一点。(不过曝、标定片黑色圆点与白色背景对比度大于100、对焦清晰)
完成调整后,关闭图像采集助手的实时显示。关闭图像采集助手窗口。
1点击采集按钮采集标定板图像
2删除标志点提取失败的图像
3图像数量为3框不提示图像数量太少为止
4可以识别的标定板图像要把相机视野覆盖完全,哪里没有覆盖到可以点击show查看。
5点击这个按钮就可以出来标定数据了,但是如果有标志点提取失败的图像,或者图像数量太少,或者视野没有完全覆盖到,那么这个标定按钮会不可用,处理以上问题即可解决。
提取标志点成功图片,有各个标志点与xyz坐标轴
提取标志点失败图片,没有各个标志点与xyz坐标轴
1、打光不均,有的地方亮有的地方暗
2、标定板的对比度不好,提取不出来标志点
3、标定文件读取错误,标定板的参数相差太大
4、对焦不清晰
点击标定按钮,自动切换到结果界面。
1相机内参
2相机外参
1点击代码生成
2选择标定数据
3点击插入代码
生成的代码
CameraParameters为相机内参
CameraPose为相机外参
CameraParameters := [0.00367057,-809.403,2.20647e-006,2.2e-006,1136.84,1064.02,2592,1944]
CameraPose := [0.0290517,-0.0118443,0.242762,0.3944,0.507229,287.921,0]
read_image (Image, ImageFiles[Index])
gen_radial_distortion_map(MapFixed,CameraParameters,CamParVirtualFixed,'bilinear')
map_image(Image,MapFixed,ImageRectifiedFixed)
ImageRectifiedFixed就是进行了畸变矫正的图像
一、像素点相机坐标转化成世界坐标系坐标
CameraParameters := [0.00367057,-809.403,2.20647e-006,2.2e-006,1136.84,1064.02,2592,1944]
CameraPose := [0.0290517,-0.0118443,0.242762,0.3944,0.507229,287.921,0]
read_image (Image, ImageFiles[Index])
image_points_to_world_plane (CameraParameters, CameraPose, TmpCtrl_ImageRows, TmpCtrl_ImageColumns, 'mm', TmpCtrl_WorldX, TmpCtrl_WorldY)
二、图片相机坐标转化成世界坐标系
CameraParameters := [0.00367057,-809.403,2.20647e-006,2.2e-006,1136.84,1064.02,2592,1944]
CameraPose := [0.0290517,-0.0118443,0.242762,0.3944,0.507229,287.921,0]
read_image (Image, ImageFiles[Index])
get_image_size (Image, Width, Height)
相机视野宽度
TmpCtrl_RectificationWidth := 79
转换成米单位
TmpCtrl_RectificationWidth := TmpCtrl_RectificationWidth / 1000.0
生成转换矩阵
gen_image_to_world_plane_map (TmpObj_RectificationMap, CameraParameters, CameraPose, Width, Height, Width, Height, TmpCtrl_RectificationWidth / Width, 'bilinear')
转换
map_image (Image, TmpObj_RectificationMap, TmpObj_RectifiedImage)
注意:像素转世界坐标系不用先进行畸变矫正,因为我们看到在转换成世界坐标系时候用到了CameraParameters,已经考虑了相机的畸变。
希望能够帮到你哦,如果帮到了你记得给我点个赞,在CSDN页面的右上角有个点赞标志。
有什么不懂得评论,我看到第一时间回复。
真心希望帮到大家。