Halcon学习(二十二)摄像机标定(函数详解)

摄像机标定程序:
注意: E:/calibration_image :为标定图像文件路径
      'E:/calibration_description/caltab_123mm.descr:为标定描述文件路径

*作者:骑蚂蚁上高速
*程序开始
list_files ('E:/calibration_image', 'files', ImageFiles)
TmpCtrl_AllMarkRows := []
TmpCtrl_AllMarkColumns := []
TmpCtrl_StartPoses := []
TmpCtrl_ReferenceIndex := 0
StartParameters := [0.008,0,5.2e-006,5.2e-006,640,512,1280,1024]
for Index := 0 to |ImageFiles|-1 by 1
    read_image (Image, ImageFiles[Index])
    find_caltab (Image, TmpObj_PlateRegion, 'E:/calibration_description/caltab_123mm.descr', 3, 112, 5)
    find_marks_and_pose (Image, TmpObj_PlateRegion, 'E:/calibration_description/caltab_123mm.descr', StartParameters, 128, 10, 18, 0.9, 15, 100, TmpCtrl_MarkRows, TmpCtrl_MarkColumns, TmpCtrl_EstimatedPose)
    TmpCtrl_AllMarkRows := [TmpCtrl_AllMarkRows, TmpCtrl_MarkRows]
    TmpCtrl_AllMarkColumns := [TmpCtrl_AllMarkColumns, TmpCtrl_MarkColumns]
    TmpCtrl_StartPoses := [TmpCtrl_StartPoses, TmpCtrl_EstimatedPose]
endfor
caltab_points ('E:/calibration_description/caltab_123mm.descr', TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z)
camera_calibration (TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z, TmpCtrl_AllMarkRows, TmpCtrl_AllMarkColumns, StartParameters, TmpCtrl_StartPoses, 'all', CameraParameters, TmpCtrl_FinalPoses, TmpCtrl_Errors)
tuple_select_range (TmpCtrl_FinalPoses, 7*TmpCtrl_ReferenceIndex, 7*TmpCtrl_ReferenceIndex + 6, CameraPose)
set_origin_pose (CameraPose, 0.0, 0.0, 0.001, CameraPose)
stop ()

一、读入图像,函数如下
list_files ('E:/calibration_image', 'files', ImageFiles)
for Index := 0 to |ImageFiles|-1 by 1
    read_image(Image, ImageFiles[Index])
endfor
注释: 'E:/calibration_image':为图像路径, 图像文件索引是从0开始的,所以 |ImageFiles|(文件数量)减去1。
算子:read_image(:Image :FileName):读取名称为FileName的图像Image。
二、提取图像Images中标定板上的圆形标志来确定标定板的有效区域,算子如下:
find_caltab(Image:Caltab:CalTabDescrFile,SizeGauss,Mark Thresh,MinDiamMarks:)
    
确定标定板上圆形标志点的二维坐标,并得到摄像机外部参数的初始值,算子如下:
find_marks_and_pose (Image, CalTabRegion: :CalTabDescrFile ,StartCamParam ,StartTh resh,                            DeltaThresh,MinThresh,Alpha,MinContLength,Max DiamMarks:Rcoord,Ccoord,                        StartPose)
   
注释函数find_caltab在图像中寻找标定板是基于标定板的特征——在一个亮的区域中存在黑色标定点。首先使用高斯滤波器进行图像平滑。参数SizeGauss确定高斯滤波器的尺寸。SizeGauss值越大进行图像平滑的幅度就越大,这在图像噪声比较大时是必要的。在进行图像平滑操作后,为了寻找标定板的位置,我们进行一个阈值分割,可以参考灰度直方图,灰度值范围由最小值MarkThresh到最大值255,因此,MarkThresh必须小于标定板上白色区域的灰度值,并且最好大于图像中其他大范围较亮的区域的灰度值。在阈值分割得到的多个区域中,其中包含孔的数量最符合标定板上标定点数量的凸状区域被选中。为了减少噪声影响,直径小于MinDiamMarks的孔将被除去。标志点的数量可以从标定板描述文件(CalTabDescrFile)中读出。
    函数find_marks_and_pose提取标定板 上各个标志点,并精确得到它们在图像坐标 系中的坐标。上面我们已经通过函数find_ca ltab找到了标定板的区域,这时我们首先在 输入图像Image的这个区域(CalTabRegion) 中应用边缘检测。这个边缘检测通过参数Al pha进行控制。Alpha的值越大 ,边缘检测的 灵敏度也就越高,这将使边缘检测时找到更 多的细节,但同时对噪声的抑制能力下降。 在边缘图像中,提取出封闭的轮廓线。为了 更准确的寻找轮廓线,对边缘的振幅进行一 个阀值操作。所有振幅高的点(标定点的边 界)都被选中。首先,这个阀值设置为StartTh
resh。如果寻找封闭轮廓线或估计位姿失 败,这个阀值接连地减DeltaThresh 直到阀 值降低到最小值MinThresh。
    闭合的轮廓线的数量必须与标定板描述文件(CalTabDescrFile)中描述的标志点的数量一致,并且这些闭合轮廓线的形状必须是椭圆状的。长度比MinContLength 短的轮廓线或者轮廓线形成区域的直径大MaxDiamMarks(如标定板的外框)的,这些轮廓线将被忽略抛弃。

三、保存坐标值

TmpCtrl_AllMarkRows := []
TmpCtrl_AllMarkColumns := []
TmpCtrl_StartPoses := []

TmpCtrl_AllMarkRows := [TmpCtrl_AllMarkRows, TmpCtrl_MarkRows]
TmpCtrl_AllMarkColumns := [TmpCtrl_AllMarkColumns, TmpCtrl_MarkColumns]
TmpCtrl_StartPoses := [TmpCtrl_StartPoses, TmpCtrl_EstimatedPose]

注释:标定点的在图像坐标系中的坐标存储 
在两个数组中,第一个数组存储所有点的行
 
坐标,第二个数组存储所有点的列坐标,并
 
且要保证两个数组的值一一对应。这些数组
 
的长度取决于标定板上标定点的个数以及
 
拍摄的标定图像的数量。它们的存储顺序是 
按照图像顺序排列的,也就是说刚开始的m
 
个值存储的是第一幅图像中m个标定点的
 
坐标值,这个顺序和函数caltab_points返回
 
的数组X,Y,Z中的存储顺序是一致的。

四、摄像机标定输入参数
StartParameters := [0.008,0,5.2e-006,5.2e-006,640,512,1280,1024]
    初始值 摄像机标定是一个非常复杂的非线性 优化的问题,因此就需要为摄像机的参数提 供尽量精确的初始值。摄像机内部参数的初 始值主要由CCD传感器和镜头的说明书确 定。面阵摄像机的内参初始值可以输入一个
数 组 [f,k,Sx,Sy,Cx,Cy,NumColumns,Nu mRows]也就是说 ,不仅要提供摄像机的初 始内参,还要提供图像的宽(NumColumns) 和高(NumRows)。
  
五、确定摄像机的内参,误差分析,算子如下
camera_calibration(: :NX,NY,NZ,Nrow, Ncol,StartCamParam,                                                        NstartPose, EstimateParams:CamParam,Nfinal Pose,Errors)
函数如下:
caltab_points ('E:/calibration_description/caltab_123mm.descr', TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z)
camera_calibration (TmpCtrl_X, TmpCtrl_Y, TmpCtrl_Z, TmpCtrl_AllMarkRows, TmpCtrl_AllMarkColumns,                     StartParameters, TmpCtrl_StartPoses, 'all', CameraParameters,                                     TmpCtrl_FinalPoses, TmpCtrl_Errors)
     
    在给定了摄像机的内外参数的初始值 之后,已知三维位置的标定点可以转换到摄 像机坐标系中。然后,寻求一组摄像机的参 数可以使通过计算投影到图像上的标定点 坐标和直接从图像中提取出的标定点的坐 标的距离最小。 这个最小化的过程将返回相当精确的 摄像机参数。然而,为了获得最高精度的摄 像机参数,需要拍摄标定板的多幅图像,在 拍摄时,标定板被放置在图像的不同位置并 且旋转的角度也不同,以致于使用外部方位 的所有自由度。 如果拍摄一幅包含标定板的图像,最优 化的参数包括摄像机的内参和一组外参。此 时,最优化的目标是确定所有这些参数能够 满足每幅图中通过投影计算得到的点坐标 和图像中直接提取的坐标值距离最小。在H ALCON中 ,使用 camera_calibration 函数就 是实现这个功能。
 
六、选择某幅图像作为参考位姿,确定摄像机外参
TmpCtrl_ReferenceIndex := 0
注释: TmpCtrl_ReferenceIndex: 为将要设置为参考位姿势的图像。0代表第一张。1代表第二张。以此类推。
tuple_select_range (TmpCtrl_FinalPoses, 7*TmpCtrl_ReferenceIndex, 7*TmpCtrl_ReferenceIndex + 6, CameraPose)
set_origin_pose (CameraPose, 0.0, 0.0, 0.001, CameraPose)
注释: tuple_select_range: 进行数组选择。
      set_origin_pose   计算摄像机外部参数。


参考文献: “基于halcon软件的摄像机标定” 闫霞,牛建强  (河南科技大学电子信息工程学院)
  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
找到标记和姿势是指通过计算机视觉技术来检测和识别图像或视频中的标记或物体,并利用这些信息确定它们的位置、朝向和姿势。 在计算机视觉领域,找到标记和姿势的任务通常使用一些基于特征点或特征描述子的方法来实现。例如,可以使用关键点检测算法(如SIFT、SURF或ORB)来自动检测图像中的关键点,然后使用特征描述子(如HOG或LBP)描述这些关键点的特征。接下来,可以通过比对特征描述子,将图像中的关键点与预先训练好的标记库或姿势模型进行匹配,从而确定标记或物体的存在和位置。 此外,还可以利用深度学习技术来找到标记和姿势。深度学习模型可以通过训练大量的图像和姿势数据来学习识别和表示不同的标记或物体。通过在卷积神经网络(CNN)等模型中训练这些数据,深度学习可以实现更准确和鲁棒的标记和姿势检测。 找到标记和姿势在许多应用领域中都具有重要意义。例如,对于增强现实(AR)应用程序,找到标记和姿势可以帮助将虚拟内容准确地与实际环境中的物体进行对齐。在自动驾驶领域,找到道路标记和车辆姿态可以帮助车辆进行准确的导航和行驶。此外,找到标记和姿势还可以用于工业自动化、机器人视觉等领域。 总之,通过计算机视觉技术找到标记和姿势是一项复杂而重要的任务,它涉及到识别和定位图像或视频中的标记或物体。这项技术在许多领域中都有重要应用,能够帮助我们更准确地理解和处理图像数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值