《HALCON机器视觉与算法原理编程实践》第13章 相机标定与三维重建
文章目录
- 13.1 立体视觉的基础知识
- 13.1.1 三维空间坐标
- 13.1.2 3D位姿
- 13.2 相机标定
- 13.2.1 相机标定的目的和意义
- 13.2.2 标定的参数
- 13.2.3 准备标定板
- 13.2.4 采集标定图像过程中与操作细节
- 13.2.5 使用Halcon标定助手进行标定
- 13.2.5 使用halcon算子进行标定
- 13.2.6 使用自定义的标定板
- 13.3 双目立体视觉
- 13.3.1 双目立体视觉的原理
- 13.3.2 双目相机的结构
- 13.3.3 双目立体视觉相机的标定
- 13.3.4 校正立体图形对
- 13.3.5 获取视差图
- 13.3.6 计算三维信息
- 13.3.7 多目立体视觉
- 13.4 激光三角测量
- 13.4.1 技术原理
- 13.4.2 使用Halcon标准标定板标定sheet-of-light
- 13.4.3 使用sheet-of-light进行测量
- 13.5 DEF方法
机器视觉的本质,是通过图像获取三维世界的真实信息。在这个过程中有两个问题需要思考,一是相机坐标系中的物体如何与真实世界坐标系中的物体进行对应,二是如何校正镜头的各种畸变。相机标定就是解决这两个问题的方法。通过标定可以获得相机的内部参数与外部参数,不但能建立图像与世界的联系,还能校正图像的畸变。
13.1 立体视觉的基础知识
使用Halcon开发立体视觉算法,可以获取检测对象的三维坐标信息,实现测量、姿态估计,或者进行三维重建。
13.1.1 三维空间坐标
在开发立体视觉算法之前,首先应对相机进行标定,特别是一些对测量精度要求高的任务,标定尤为重要。而标定的意义在于将二维图像中的点与三位空间中的真实物体所处的点坐标关联起来。
(1)三维坐标系
(2)平移变换
(3)旋转变换
13.1.2 3D位姿
在Halcon中,可以使用create_pose算子创建3D位姿。
create_pose( : : TransX, TransY, TransZ, RotX, RotY, RotZ, OrderOfTransform, OrderOfRotation, ViewOfTransform : Pose)
13.2 相机标定
如果要从图像中获取准确的三维世界的真实信息,用于测量或者定位等,则首先必须对相机进行标定校准。相机的标定可以建立二维图像中的点与三维空间中的点的对应关系。
13.2.1 相机标定的目的和意义
相机标定是机器视觉的基础,标定结果的好坏直接决定了机器视觉的系统精度,作用可见一斑。
Halcon支持两种类型的镜头标定,一种是类似于人眼的针孔相机模型的镜头,另一种是远心镜头。
(1)普通光学镜头成像模型是小孔成像
(2)远心镜头
针孔相机模型是理想的透视模型,其会因为透视的关系得到近大远小的图像,也会因为镜头的偏差产生畸变,即几何失真。几何失真是从图像中心到边缘的一种变形,越靠近边缘,变形会越严重。
远心镜头则不会因为镜头移动而产生透视误差,图像大小不会受到拍摄距离的影响,在固定的成像距离范围内,其放大率一致且畸变极小。
13.2.2 标定的参数
- 内部参数
- 外部参数
- 相机类型与畸变模型
13.2.3 准备标定板
使用 Halcon进行标定的步骤一般如下
(1)使用 Halcon中的 Calibration助手进行标定,得到相机的参数
(2)使用畸变校正相关的算子进行图像的校正
因此,标定要做的首要的事情是选择一块合适的标定板。通常情况下,标定板有很多种类,如棋盘格、点阵等。在 Halcon中,最简单的标定材料是 Halcon标准标定板。如果要使用 Halcon的标定算子,则需要使用 Halcon的点阵标定板。
gen_caltab(::XNum,YNum,MarkDist,DiameterRatio,CalTabDescrFile,CalTabPSFile 😃 算子来制作一个标定板
XNum 每行黑色标志圆点的数量。
YNum 每列黑色标志圆点的数量。
MarkDist 两个就近黑色圆点中心之间的距离。单位是meter
DiameterRatio 黑色圆点直径与两圆点中心距离的比值。
CalTabDescrFile 标定板描述文件的文件路径(.descr)。这两个文件路径是用来存放文件的
CalTabPSFile 标定板图像文件的文件路径(.ps)
13.2.4 采集标定图像过程中与操作细节
~
13.2.5 使用Halcon标定助手进行标定
13.2.5 使用halcon算子进行标定
~
13.2.6 使用自定义的标定板
~
13.3 双目立体视觉
如果无法通过二维平面完成检测任务,如检测目标的表面高度,则可以考虑使用双目视觉进行测量。
13.3.1 双目立体视觉的原理
基于双目立体视觉的深度相机类似人类的双眼,和基于TOF、结构光原理的深度相机不同,它不对外主动投射光源,完全依靠拍摄的两张图片(彩色RGB或者灰度图)来计算深度,因此有时候也被称为被动双目深度相机。比较知名的产品有STEROLABS 推出的 ZED 2K Stereo Camera和Point Grey 公司推出的 BumbleBee。
下面简单的总结一下双目立体视觉深度相机的深度测量过程,如下:
1、首先需要对双目相机进行标定,得到两个相机的内外参数、单应矩阵。
2、根据标定结果对原始图像校正,校正后的两张图像位于同一平面且互相平行。
3、对校正后的两张图像进行像素点匹配。
4、根据匹配结果计算每个像素的深度,从而获得深度图。
视频介绍:[youtube搬运]ZED双目摄像头 - World of Depth
https://www.bilibili.com/video/BV1Ls411B7Fv?from=search&seid=1384913839733439648
13.3.2 双目相机的结构
13.3.3 双目立体视觉相机的标定
双目相机的内部参数的标定与常规的单目相机标定方法相同,二者的区别主要在于外部参数即两个相机之间的相对位置关系
双目相机的标定方法与单目相机基本相同,但有以下几个方面需要注意。
(1)相机安装的位置应考虑与被测物体的距离。
(2)相机位置确定后,应将两个相机进行固定。
(3)将标定板放置在两个相机都能够完全拍到的位置上。
(4)两个相机的光照环境应尽可能一致。
13.3.4 校正立体图形对
标定结束后,可以使用双目相机拍摄被测物体。
13.3.5 获取视差图
binocular_disparity(ImageRect1, ImageRect2 : Disparity, Score : Method, MaskWidth, MaskHeight, TextureThresh, MinDisparity, MaxDisparity, NumLevels, ScoreThresh, Filter, SubDisparity : )
13.3.6 计算三维信息
disparity_image_to_xyz(Disparity : X, Y, Z : CamParamRect1, CamParamRect2, RelPoseRect : )
13.3.7 多目立体视觉
多目立体视觉使用两个以上的信息,可以呈现更多的视角,不仅能反应物体的表面信息,甚至还能还原整个三维场景。
13.4 激光三角测量
使用立体视觉进行三维重建,适用于测量范围比较大的场合,精度不够高。如果需要进行近距离的精确测量,可以使用sheet-of-light技术,又称激光三角测量或者片光技术。使用这种方式进行三维重建,精度可以达到非常高的级别,但是需要额外的硬件进行配合。
13.4.1 技术原理
参考:https://www.cnblogs.com/DOMLX/p/11555100.html
13.4.2 使用Halcon标准标定板标定sheet-of-light
(1)标定相机
(2)确定世界坐标系中的光平面方向
(3)标定物体的相对位移
*使用相机参数校正畸变* CameraParameters为相机的内部参数CameraParameters := [0.0271606, -518.0, 1.48e-005, 1.48e-005, 271.343, 260.681, 640, 480]* CameraPose为相机的外部参数,即位姿CameraPose := [0.258487, -0.018, 4.954, 2.0, 14.0, 2.4, 0]scaleParam := 1920/1080.0*读取待校正的图像read_image (Image, 'data/chess')*调整原点的位姿set_origin_pose (CameraPose, -1,-0.7, 0, rectificationPose)*生成用于校正的映射图,用来描述图像坐标系与世界坐标系之间的映射gen_image_to_world_plane_map(rectificationMap,CameraParameters, rectificationPose, 640, 480, 640, 480, scaleParam/ 640, 'bilinear')*利用映射图rectificationMap进行图像的校正map_image (Image, rectificationMap, rectifiedImage)
13.4.3 使用sheet-of-light进行测量
~
13.5 DEF方法
DFF( Depth from Focus,焦距深度)是一种使用在不同焦距下拍摄的图像来重建3D表面信息的方法。该方法使用的是一种称为“Z轴图像”的采集图。Z轴是相对垂直于图像平面的,可以用于表现物体的深度。该方法通过调整相机在Z轴上的位置,获取被拍摄物在不同Z轴位置的图像样本序列。
DEF方法的具体操作步骤如下:
(1)读取拍摄的不同焦距的图像
(2)利用每个通道中图像的清晰度差别计算图像的深度
(3)如果要将深度效果进行3D显示,可以先对深度图进行平滑处理
(4)使用compose2算子,将深度图以三维方式显示出来
DEF方法比立体视觉或者 sheet-of-light方法获得的精度还要高,只需要单个相机就可以完成,但该方法需要用到远心或者微距镜头,以实现几乎平行于拍摄面的投影,所以只适合较小的物件如半导体器件等。
除了使用 Halcon提供的方法外,还可以使用其他方式,如直接使用传感器设备(如可测深度的摄像头)测量图像的深度,也可以获取拍摄对象的深度图像。