摄像机标定程序:
注意: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相机标定

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

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

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

  3. [zt]摄像机标定(Camera calibration)笔记

    http://www.cnblogs.com/mfryf/archive/2012/03/31/2426324.html 一 作用建立3D到2D的映射关系,一旦标定后,对于一个摄像机内部参数K(光心焦 ...

  4. [OpenCV-Python] OpenCV 中摄像机标定和 3D 重构 部分 VII

    部分 VII摄像机标定和 3D 重构 OpenCV-Python 中文教程(搬运)目录 42 摄像机标定 目标 • 学习摄像机畸变以及摄像机的内部参数和外部参数 • 学习找到这些参数,对畸变图像进行修 ...

  5. 【OpenCV】摄像机标定+畸变校正

      摄像机标定 本文目的在于记录如何使用MATLAB做摄像机标定,并通过OpenCV进行校正后的显示. 首先关于校正的基本知识通过OpenCV官网的介绍即可简单了解: http://docs.open ...

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

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

  7. 机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定

    本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)--单目摄像机标定参数说明之后 ...

  8. Matlab 摄像机标定+畸变校正

    博客转载自:http://blog.csdn.net/Loser__Wang/article/details/51811347 本文目的在于记录如何使用MATLAB做摄像机标定,并通过opencv进行 ...

  9. C#下的摄像机标定

    前言:计算机视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体,而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决 ...

随机推荐

  1. .net实现调用本地exe等应用程序的办法总结

    根据客户需求用户要实现在一个BS系统上打开本地的一应用程序,在网上查了好多资料再加上自己的各种测试,到最后功能是实现了,只不过还存在一些问题,接下来会先把各种方法一一列举出来 1.先写最终测试通过的这 ...

  2. 9,SFDC 管理员篇 - 安全设置

    1, 使用Profile控制权限 (整体层面)     Setup | Manage Users | Profiles 总结下,一个用户只能有一个Profile,但是可以有多个Permission S ...

  3. node socket.io web

    soket.io & web http://socket.io/get-started/chat/ 新建一個文件夾 soketWeb ; 在sokertWeb 文件夾內新建一個 package ...

  4. 读取ini配置文件

    http://blog.sina.com.cn/s/blog_4d11e5f20100fm2s.html c程序有两种方式传入参数到执行文件中:1.运行exe时,直接输入参数:ping.exe 10. ...

  5. regression build test

    Q: 什么是regression test以及为什么做regression test? A: fixing1进到build之后,QA/tester要进行手动测试,也可能会写automation.但是随 ...

  6. Error : Must specify a primary resource (JAR or python or R file)

    spark-submit 报错:must specify resource 取消关注 | 1 ... 我的submit.sh内容: /bin/spark-submit \ --class abc.pa ...

  7. Mysql命令行中文乱码的解决方法

    环境:Windows 8 64位,Mysql  5.0.96 for Win64 (x86) 数据库本身安装时默认已经是使用utf8编码的了,但在命令行中执行查询时,查询到的中文依然乱码,解决方法如下 ...

  8. Linux内核启动logo

    之前在分析samsung的fb驱动代码的时候,其中有一段代码是处理内核logo显示相关的,今天就内核logo这个话题来聊一聊! 一.处理内核logo显示相关的代码在哪? 回到samsung的fb驱动代 ...

  9. linux 下如何安装Telnet ?

    1 如何查看我的linux下是否安装了这个服务?2 没有安装的情况下,如何安装?3 client端 需要安装什么吗? 查看:rpm -qa | grep telnet安装:yum install -y ...

  10. Linq查询数据集取得排序后的序列号(行号)

    今天群里有同学问如何用linq取结果集的行号,查了一下资料,发现linq有很简单的方法可以实现,花了几分钟写了一个测试用例,现记录下来,以备参考: /// <summary> /// 测试 ...