halcon 标定注意事项和自标定

Halcon标定步骤

扫码查看
 

Halcon标定步骤

1.设置相机内部参数的初始值

StartCamPar := [0.016,0,0.0000074,0.0000074,326,247,652,494]
set_calib_data_cam_param (CalibDataID, 0, 'area_scan_division', StartCamPar)

1.1 相机型号

(1)面阵

(2)线阵

1.2 参数设置(这里只讲面阵相机)

(1)Division畸变模型

CameraParam:[Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]

(2)Polynomial 畸变模型

CameraParam:[Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight]

注:当镜头为远心镜头时,Focus=0;

1.3 畸变类型的选择

Division畸变模型只适用于进度要求不是很高,标定图片数量较少的情况;Polynomial 畸变模型对镜像

畸变和切向畸变都校正,精度较高,花费时间长。

1.4 标定时个参数值的确定技巧

Focus f:镜头的标称焦距, e.g., 0.016 m.; 对于远心镜头为0.
      κ: 一般去0.0
      Or:
      K1, K2, K3,P1, P2:可全部初始化为0
      Sx: 由CCDCMOS确定建议取值如下:
           Full image (640*480) Subsampling (320*240)
           1/3"-Chip 0.0000055 m 0.0000110 m
           1/2"-Chip 0.0000086 m 0.0000172 m
           2/3"-Chip 0.0000110 m 0.0000220 m
      Sy: 由CCDCMOS确定建议取值如下:

for example:
           Full image (640*480) Subsampling (320*240)
           1/3"-Chip 0.0000055 m 0.0000110 m
           1/2"-Chip 0.0000086 m 0.0000172 m
           2/3"-Chip 0.0000110 m 0.0000220 m

Cx and Cy: 光心坐标初始值,建议取值如下:
         for example:
          Full image (640*480) Subsampling (320*240)
          Cx 320.0 160.0
          Cy 240.0 120.0
      ImageWidth,ImageHeight:有实际图片大小来初始化该值
       for example:
      Full image (640*480) Subsampling (320*240)
      ImageWidth 640 320
      ImageHeight 480 240

2.标定板初始化

CaltabName := 'caltab_30mm.descr'//标定板描述文件
    set_calib_data_calib_object (CalibDataID, 0, CaltabName)

3.创建数据模型

create_calib_data ('calibration_object', 1, 1, CalibDataID)

4.获取标定图片

相机拍摄不同位姿下图片8-15张,拍摄图片时标定板尽量覆盖整个视场(标定板要根据工作距离、视场大小定制);拍摄图片上的圆直径不得小于10个像素

5.加载所有图像,寻找标定板区域,确定圆心,将结果加载到组元中

for I := 1 to NumImages by 1
... acquire image ...
  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)
  set_calib_data_observ_points (CalibDataID, 0, 0, I, RCoord, CCoord, 'all', StartPose)
endfor

下面将Halcon中提取目标点的大致原理说一下:

首先find_caltab 算子对图像高斯滤波(核大小为SizeGauss),接着阈值分割(与之大小为MarkThresh)将标定板的区域找出来, find_marks_and_pose 算子对区域中的圆进行分割,找到圆的个数,周长,坐标位置等应该和标定板描述文件中的一致,否则会自动调整StartThresh,使得StartThresh按照DeltaThresh步长减小到MinThresh,知道找到准确的圆心。

6.有了所有图像中的圆心就可以标定了

calibrate_cameras (CalibDataID, Errors)

返回平均投影误差Errors

以下是一个伪代码段.......(明天再续)
* Calibration parameters
CaltabDescr := 'caltab_100mm.descr'
CaltabThickness := 0.0064
NumCameras := 4
NumCalibObjects := 1
NumPoses := 20
CameraType := 'area_scan_polynomial'
StartCamPar := [0.0085, 0.0, 0.0, 0.0, 0.0, 0.0, 6e-6, 6e-6, Width*.5, Height*.5, Width, Height]
*
* Create camera calibration model and set parameters
create_calib_data ('calibration_object', NumCameras, NumCalibObjects, CalibDataID)
* Set used camara type
set_calib_data_cam_param (CalibDataID, 'all', CameraType, StartCamPar)
* Set used calibration object
set_calib_data_calib_object (CalibDataID, 0, CaltabDescr)

 
 
 

HALCON 20.11:标定助手使用注意事项

  1. 标定过程中需要保持相机(光圈、焦距、位姿)固定。
  2. 标定板有两种:六角形排列标定板(.cpd文件)和矩形排列标定板(.descr文件)。
  3. 透明标定板可用于需要背光照明的应用场合。
  4. 六角形排列标定板应该填充整个图像,矩形排列标定板应该填充图像的四分之一。
  5. 标定过程中,首先需要改进的是图像质量。
  6. 标定助手中,相机参数指的是相机内部参数,如焦距,像元尺寸(宽/高)等;外部参数指的是相机相对于世界坐标系的位置和旋转角度等。
  7. 初次标定时,可以直接选择完全标定(Full Calibration)。完全标定时,远心镜头不需要设置焦距大小,只需要设置放大倍数;标准镜头需要设置焦距大小。
  8. 参考图像是指该图像定位世界坐标系,其原点位于参考图像中标定板的原点。标定板的原点为六角形排列标定板的第一寻址模式的中心标记的中心;或矩形排列标定板的中心。默认情况下,第一个标定图像被用作参考图像。但是,您也可以选择任何标定序列中的其他图像。
  9. 标定助手中,标准镜头是指与人眼类似的透射投影镜头,即物体离得越远,在图像中就越小;远心镜头是指平行投影镜头,即物体在图像中的大小与它们与相机的距离无关。
  10. 六角形排列标定板通常在深色背景上有浅色标记。不过,在浅色背景上有深色标记的标定板也是可用的,此时只需选择一个文件名以“_dark_on_light”结尾的描述文件即可。
  11. 矩形排列标定板总是在浅色背景上印有深色标记。
  12. 标定板厚度参数的作用:可以通过参考图像中的厚度值来修改世界坐标系和位于标定板表面下方的测量平面的位置。
  13. 相机模型中的面扫描(除法)(Area Scan (Division))通常可以返回良好的结果,您也可以通过使用面扫描(多项式)(Area Scan(多项式))相机模型提高准确性并降低错误率。因此,如果标定状态的平均误差过高,我们建议您使用面扫描(多项式)(Area Scan(多项式))相机模型。
  14. 使用面扫描(多项式)(Area Scan(多项式))相机模型,必须保证标定板图像完全覆盖视场并不遗漏图像边缘。较高的平均误差可能是由不适当的标定图像造成的。
  15. 标定过程的主要工作是获取标定板相对于视觉系统的不同位置和方向的图像。请注意:你改变的位置和方向越多,标定结果就会越好。因此,放置标定板时,使其出现在不同的角落(对于矩形排列标定板;六角形排列标定板以单幅图像覆盖整个图像),出现在距相机的不同距离处,出现在不同的平面上(即对某些图像进行倾斜)。注意,对于矩形排列标定板,不仅需要将标定板放置在视野的中心,而且还需要将其移动到角落和边缘。良好的标定图像将显著提高您的标定结果。
  16. 标定助手目前支持8位和16位(' byte '和' uint2 ')图像。
  17. 标定使用单通道图像。对于彩色RGB图像,将使用红色通道。颜色变换可以通过操作符trans_from_rgb来执行。
  18. 可以根据参考图像中标定板的姿态,指定世界坐标系和测量平面,以便用于后续的三维测量。因此,在一个标定图像(通常是第一个)中,您应该将标定板放置在测量平面的顶部。如果不可能,将标定板放在一个平行于测量平面的位置,并通过调整参数厚度“移动”坐标系统。“标定”窗口左侧的星号表示参考图像。它是默认设置在第一个图像。但是,您可以通过单击“设为参考位姿(Set Reference)”按钮,选择另一个图像作为参考图像。
  19. 你用的是极广角镜头吗? 接近图像边界的畸变会导致更高的平均误差,甚至可能导致标定失败。
  20. 你的相机芯片的尺寸和镜头兼容吗?使用与相机芯片大小不兼容的镜头将降低图像质量。
  21. 应该始终追求获得高质量图像。然而如果由于某些原因,无法获得高质量图像,您可以在标定板提取参数下调整一些参数:
    六角形排列标定板:如果图像是模糊的或包含强噪声,应将“平滑(Sigma)”设置为一个更高的值。
    矩形排列标定板:如果标定板倾斜强烈,“间距公差(Gap Tolerance)”应设置为较高值;如果图像模糊,“平滑(Alpha)”应设置为较小值;此外,可改变最大标记直径。
  22. 平均误差(Mean Error)是指在标定过程中以像素为单位的平均误差。一旦系统进行了标定,就会计算出标定标记的理想中心,并与真实标记中心进行比较。平均误差是理想标记中心和真实标记中心之间的偏差值。0.1或更低的值被认为是一个好的结果。

 

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

在项目中,偶尔会遇到由于产品形状、拍摄位置等原因导致标定板很难放置的情况,此时可以考虑使用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

进行图像畸变矫正

 

完整源码如下:

*公众号:机器视觉那些事儿**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坐标系,用于定位项目。所以,相机标定后的应用,会在后续的测量篇以及手眼标定篇涉及,请持续关注。

 

posted @   QuincyYi  阅读(1238)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示