【相机标定篇】halcon自标定(3)

2019-06-03 18:07:03 浏览数 (1)

“一滴水,用显微镜看,也是一个大世界

在项目中,偶尔会遇到由于产品形状、拍摄位置等原因导致标定板很难放置的情况,此时可以考虑使用halcon自标定算法来标定相机。由于自标定可以在不使用用标定板情况下,进行畸变矫正。所以,极大地方便在设备现场进行调试。


1. 自标定处理流程

自标定原理来源于此论文:“Automatic line-based estimation of radial lens distortion”。

论文下载地址:

链接:https://pan.baidu.com/s/118YDti24nvbnsz2CbOJa1Q 提取码:5t67

从论文中可知自标定的一般流程:轮廓检测、共线线段连接、剔除干扰线、求取畸变参数。如下图所示。

在halcon我们可以对自标定流程梳理为两大步骤:1.检测直线轮廓XLD 2.图像畸变矫正,如下图所示。

2. 自标定相关算子

radial_distortion_self_calibration(Contours : SelectedContours : Width, Height, InlierThreshold, RandSeed, DistortionModel, DistortionCenter, PrincipalPointVar : CameraParam)

名字:径向畸变自标定

描述:此算子通过XLD轮廓数据来估算镜头的畸变参数和畸变中心。其获得的即便参数通过相机内参数CameraParam返回。此算子不能矫正焦距和比例因子,因此不能用于3D测量中。

参数:

Contours :输入用来矫正的轮廓数据

SelectedContours :矫正后的轮廓数据

Width:获取轮廓数据的图像宽度

Height:获取轮廓数据的图像高度

InlierThreshold:分类阈值

RandSeed:随机种子

DistortionModel:畸变模式

DistortionCenter:畸变中心的估算模式

PrincipalPointVar :偏差控制

CameraParam:输出相机内参数

change_radial_distortion_cam_par( : : Mode, CamParamIn, DistortionCoeffs : CamParamOut)

名字:矫正畸变参数

描述:根据指定的径向畸变系数,求取理想无畸变的相机内参。

参数:

Mode:畸变模式

CamParamIn:畸变的相机内部参数

DistortionCoeffs :畸变系数值

CamParamOut:已校正的相机内参

change_radial_distortion_image(Image, Region : ImageRectified : CamParamIn, CamParamOut : )

名字:矫正畸变图像

描述:根据指定图像和指定相加参数来矫正输入图像的畸变

参数:

Image:输入图像

Region :矫正图像的区域

ImageRectified :矫正图像

CamParamIn:输入相机参数

CamParamOut :输出相机参数


3. 实例分析

首先进行边缘检测, 选择包含一定长度,一定数量直线段的XLD轮廓

使用radial_distortion_self_calibration算子进行自标定,

得到相机内参以及用于标定的直线段

利用change_radial_distortion_cam_par 、以及change_radial_distortion_image

进行图像畸变矫正

完整源码如下:

代码语言:javascript复制
*公众号:机器视觉那些事儿**1. 算法功能:径向畸变自校正*2. 算法思路:*      (1)检测含直线轮廓XLD*      (2)矫正畸变图像
*---------初始化,读图------------dev_update_off ()read_image (Image, 'board/board-01')dev_close_window ()dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)set_display_font (WindowHandle, 16, 'mono', 'true', 'false')dev_display (Image)disp_message (WindowHandle, 'Image with radial distortions', 'window', 0, 0, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true')stop ()
*----------------(1)检测直线轮廓XLD=----------------* i 利用canny滤波器提取图像边缘edges_sub_pix (Image, Edges, 'canny', 1, 10, 40)* ii 分割直线段以及圆弧线段segment_contours_xld (Edges, SplitEdges, 'lines_circles', 5, 4, 2)* iii 选择足够长的线段用于自标定select_shape_xld (SplitEdges, SelectedEdges, 'contlength', 'and', 30, 100000)dev_display (Image)dev_set_colored (12)dev_display (SelectedEdges)disp_message (WindowHandle, 'Extracted edges', 'window', 0, 0, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true')stop ()dev_clear_window ()disp_message (WindowHandle, 'Performing self-calibration...', 'window', 0, 0, 'black', 'true')
*----------------(2)矫正畸变图像=----------------* i 相机自标定,根据边缘求取内参radial_distortion_self_calibration (SelectedEdges, CalibrationEdges, 646, 492, 0.08, 42, 'division', 'variable', 0, CamParSingleImage)* ii 获取无畸变相机内参get_domain (Image, Domain)change_radial_distortion_cam_par ('fixed', CamParSingleImage, 0, CamParSingleImageRect)* iii 根据内参,进行图像畸变矫正change_radial_distortion_image (Image, Domain, ImageRectified, CamParSingleImage, CamParSingleImageRect)
*-----------结果显示------------*显示原始图像XLD以及用于矫正图像所需的直线段dev_display (Image)dev_display (CalibrationEdges)disp_message (WindowHandle, 'Edges used for calibration', 'window', 0, 0, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true')stop ()*显示矫正图像dev_display (ImageRectified)disp_message (WindowHandle, 'Image without radial distortions', 'window', 0, 0, 'black', 'true')disp_continue_message (WindowHandle, 'black', 'true')stop ()

4. 注意事项

  1. halcon的自标定是根据物体边缘的直线,来进行图像矫正,所以需保证图像畸变较大的边缘有足够的直线段;
  2. 实际项目中被检测物若没有理想的直线段,可以使用棋盘格、标准物、菲林片等代替;
  3. 运行内存大于等于4G。

5. 后续步骤

自标定只需要一张图片,即可标定相机内参,后续若需要将像素单位换算至公有制单位,需要使用棋盘格、标准物、菲林片等进行转换,便可应用于测量项目;也可以利用一定网格构建XY坐标系,用于定位项目。所以,相机标定后的应用,会在后续的测量篇以及手眼标定篇涉及,请持续关注。


0 人点赞