摄像机标定程序:
注意: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,MarkThresh,MinDiamMarks:)
    
确定标定板上圆形标志点的二维坐标,并得到摄像机外部参数的初始值,算子如下:
find_marks_and_pose (Image,CalTabRegion: :CalTabDescrFile ,StartCamParam ,StartThresh,                           DeltaThresh,MinThresh,Alpha,MinContLength,MaxDiamMarks:Rcoord,Ccoord,                       StartPose)
   
注释函数find_caltab在图像中寻找标定板是基于标定板的特征——在一个亮的区域中存在黑色标定点。首先使用高斯滤波器进行图像平滑。参数SizeGauss确定高斯滤波器的尺寸。SizeGauss值越大进行图像平滑的幅度就越大,这在图像噪声比较大时是必要的。在进行图像平滑操作后,为了寻找标定板的位置,我们进行一个阈值分割,可以参考灰度直方图,灰度值范围由最小值MarkThresh到最大值255,因此,MarkThresh必须小于标定板上白色区域的灰度值,并且最好大于图像中其他大范围较亮的区域的灰度值。在阈值分割得到的多个区域中,其中包含孔的数量最符合标定板上标定点数量的凸状区域被选中。为了减少噪声影响,直径小于MinDiamMarks的孔将被除去。标志点的数量可以从标定板描述文件(CalTabDescrFile)中读出。
    函数find_marks_and_pose提取标定板上各个标志点,并精确得到它们在图像坐标系中的坐标。上面我们已经通过函数find_caltab找到了标定板的区域,这时我们首先在输入图像Image的这个区域(CalTabRegion)中应用边缘检测。这个边缘检测通过参数Alpha进行控制。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,NumRows]也就是说 ,不仅要提供摄像机的初始内参,还要提供图像的宽(NumColumns)和高(NumRows)。
  
五、确定摄像机的内参,误差分析,算子如下
camera_calibration(: :NX,NY,NZ,Nrow,Ncol,StartCamParam,                                                       NstartPose,EstimateParams:CamParam,NfinalPose,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)
    
    在给定了摄像机的内外参数的初始值之后,已知三维位置的标定点可以转换到摄像机坐标系中。然后,寻求一组摄像机的参数可以使通过计算投影到图像上的标定点坐标和直接从图像中提取出的标定点的坐标的距离最小。这个最小化的过程将返回相当精确的摄像机参数。然而,为了获得最高精度的摄像机参数,需要拍摄标定板的多幅图像,在拍摄时,标定板被放置在图像的不同位置并且旋转的角度也不同,以致于使用外部方位的所有自由度。如果拍摄一幅包含标定板的图像,最优化的参数包括摄像机的内参和一组外参。此时,最优化的目标是确定所有这些参数能够满足每幅图中通过投影计算得到的点坐标和图像中直接提取的坐标值距离最小。在HALCON中 ,使用 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相机标定的更多相关文章

  1. halcon相机标定及图像矫正

    https://blog.csdn.net/humanking7/article/details/44756073 相机标定内容详解:转载自 祥的博客 预备知识 标定中的四个坐标系 1.1.平面旋转 ...

  2. Halcon学习笔记——机器视觉应用工程开发思路及相机标定

    机器视觉应用工程开发思路 机器视觉应用工程主要可划分为两大部分,硬件部分和软件部分. 1.硬件部分,硬件的选型至关重要,决定了后续工作是否可以正常开展,其中关键硬件部分包括:光源,相机以及镜头. 2. ...

  3. 使用OpenCV进行相机标定

    1. 使用OpenCV进行标定 相机已经有很长一段历史了.但是,伴随着20世纪后期的廉价针孔照相机的问世,它们已经变成我们日常生活的一种常见的存在.不幸的是,这种廉价是由代价的:显著的变形.幸运的是, ...

  4. halcon 手眼标定的坐标转换原理讲解

    原文链接:https://blog.csdn.net/opencv_learner/article/details/82113323 一直以来,对于手眼标定所涉及到的坐标系及坐标系之间的转换关系都没能 ...

  5. Halocn双目相机标定

    [Halcon]Halcon双目标定 相机标定(4)---基于halcon的双目立体视觉标定 双目立体视觉:四(双目标定matlab,图像校正,图像匹配,计算视差,disparity详解,) 双目测距 ...

  6. 相机标定简介与MatLab相机标定工具箱的使用(未涉及原理公式推导)

    相机标定 一.相机标定的目的 确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数. 二.通用摄像机模型 世界坐标系.摄像机坐标 ...

  7. 相机标定:关于用Levenberg-Marquardt算法在相机标定中应用

    LM算法在相机标定的应用共有三处. (1)单目标定或双目标定中,在内参固定的情况下,计算最佳外参.OpenCV中对应的函数为findExtrinsicCameraParams2. (2)单目标定中,在 ...

  8. OpenCV相机标定和姿态更新

    原帖地址: http://blog.csdn.net/aptx704610875/article/details/48914043 http://blog.csdn.net/aptx704610875 ...

  9. 相机标定 matlab opencv ROS三种方法标定步骤(2)

    二  ubuntu下Opencv的相机标定 一般直接用Opencv的源码就可以进行相机的标定,但是可能只是会实现结果,却不懂实现的过程,我也是模模糊糊的看了<计算机视觉中的多视图几何>以及 ...

随机推荐

  1. unity --项目总结

    最近做的unity的项目涉及到的问题如下: 1.绘制折线图问题: 起初利用的unity自带的linerender组件,这种方法绘制的线不均匀,效果不好.然后又利用画线插件Ves……开头的那个,结果那个 ...

  2. sublim text3 配置

    喜欢用sublime,但每次换环境都要重新百度下配置,太麻烦,故在此把自己喜欢的配置记录下来 sublime text2 可以直接在设置里改,但sublime text3不能直接在设置中改值,只能在s ...

  3. ubuntu搭建svn服务器(转)

    在阿里云买了个服务器,想上传东西,samba不好用,想起来可以搭个svn用,找到了这篇. 1. 安装SVN apt-get install subversion 2. 建立svn仓库 1). 建立sv ...

  4. OkHttp使用进阶 译自OkHttp Github官方教程

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/3997368.html 没有使用过OkHttp的,可以先看Ok ...

  5. Largest Rectangle in a Histogram(HDU1506)

    Largest Rectangle in a Histogram HDU1506 一道DP题: 思路:http://blog.csdn.net/qiqijianglu/article/details/ ...

  6. FIM相关报错汇总

    1.错误1:FIM在修改MA名字的时候报错: The management agent cannot be deleted or renamed because the working directo ...

  7. 502 Server dropped connection

    在本地电脑上开启了,全局VPN代理后,出现 502 报错. 502 Server dropped connection The following error occurred while tryin ...

  8. 如何查看cache信息

    很多时候查不到本机cpu的cache信息.而了解这些信息,对于调优很有帮助 查看1级缓存cache大小 cat /sys/devices/system/cpu/cpu0/cache/index1/si ...

  9. [leetcode 17]Letter Combinations of a Phone Number

    1 题目: Given a digit string, return all possible letter combinations that the number could represent. ...

  10. Magicodes.WeiChat——使用AntiXssAttribute阻止XSS(跨站脚本攻击)攻击

    跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往Web页面里插 ...