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

Halcon学习(二十二)摄像机标定(函数详解)TmpCtrl_AllMarkRows := []TmpCtrl_AllMarkColumns := []TmpCtrl_StartPoses := []TmpCtrl_ReferenceIndex := 0StartParameters := [0.008,0,5.2e-006,5.2e-006,640,512,1280,1024]for Index := 0 to |ImageFiles|-1 by 1read_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]endforcaltab_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 1read_image(Image, ImageFiles[Index])endfor注释:'E:/calibration_image':为图像路径,图像文件索引是从0开始的,所以|ImageFiles|(文件数量)减去1。
halcon相机标定和测量示例

Halcon单相机标定和测量示例相机标定有很多方式:九点标定法、棋盘格标定法、圆形阵列标定法;本次采用圆形阵列标定法。
1Halcon相机标定1.1标定板描述文件编制此次相机标定采用的是网购的标定板(直接在万能的某宝搜halcon标定板),如图1。
采购的时候卖家会提供标定板的相应参数,如图2。
图1标定板图 2 标定板参数用halcon标定助手标定的时候需要用到标定板的描述文件,此文件可以用gen_caltab算子自己编制。
如下为函数说明:gen_caltab( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : ) 函数说明:创建一个标定文件和相应的脚本文件。
函数参数:Xnum:输入X方向标记(圆点)的数量,Xnum>1;Ynum:输入Y方向标记(圆点)的数量,Ynum>1;MarkDist:标记圆圆心间距离,单位“m”;(我看过一个资料翻译为标记点大小,差点被坑死)DiameterRatio:两标记点距离和标记直径的比值,默认:0.5。
0<DiameterRatio<1.0;CalPlateDescr:输入要保存的标定文件(此文件保存路径在算子窗口可更改),默认值: 'caltab.descr',参考: 'caltab.descr', 'caltab_100mm.descr', 'caltab_10mm.descr', 'caltab_200mm.descr', 'caltab_30mm.descr';CalPlatePSFile :标定板图像文件的文件路径(此文件保存路径在算子窗口可更改),默认: 'caltab.ps',后缀:ps。
此算子“XNum, YNum, MarkDist, DiameterRatio”这四个参数根据图2所示的标定板参数设置。
halcon单相机标定详细说明

XYZ
方向平移和旋转标定板,采集 18 张图像
图 9 Halcon 三维标定采集图像示例
3、Halcon 的二维标定,只在 XY 平面内平移和旋转标定板,采集 影响提高标定精度
18 张图像,减小 Z 的
实验数据:
方法一 方法二 方法三
图像坐标 X 方向像素物理距离 15.5618um 15.7575um
,
这就使得主点不一定在图像的帧存中心 ,故需要标定 ,,的值。
单个像元的高宽 ????,????,该数据可以在制造商提供的技术文档中查到,但是该数据不是 完全准确的。 单个像元的高宽理论上应该是相等的, 但是由于制造的误差, 两者不可能完全
相等,因此需要根据实际情况对其进行修正。
透镜的畸变失真系数前面讲到理想的透镜成像才满足线性关系
征点提取的算法了。 Halcon 的标定板如图 5 所示,黑色的边框中有阵列分布的原点,在边 框的左上角有个小三角用来确定其旋转的位置。
以 30*30mm 的标定板为例:
黑色原点: 7*7 边框长度: 30*30mm 内边框长度: 28.125mm*28.125mm 黑色原点半径: 0.9375mm 原点中心间距: 3.75mm 裁剪宽度: 30.75*30.75mm
针孔模型是理想透镜的成像模型,但是实际中相机的透镜不可能是理想的模型,透镜形
状的非理想特征造成像点会沿径向发生畸变。一个像点沿径向内缩叫负畸变
,或桶形畸变沿
径向外延叫正畸变 ,或枕形畸变。这种崎变相对于光轴严格对称的
,也是畸变的主要分量 [2] 。
( X u ,Y u)为矫正后的坐标, (X d ,Y d)是受到镜头失真影响而偏移的像平面坐标,径向 径向畸变模型:
标定的方法从原理上主要分为三大类:线性标定、非线性标定和二次标定。 使用的标定板有棋盘格也有原点阵列,如图 4 所示。
HALCON函数介绍

HALCON函数介绍HALCON函数介绍(转)sobel_amp( Image : EdgeAmplitude : FilterType, Size : )根据图像的一次导数计算图像的边缘close_edges( Edges, EdgeImage : RegionResult : MinAmplitude : )close_edges_length( Edges, Gradient : ClosedEdges : MinAmplitude, MaxGapLength : ) 使用边缘高度图像关闭边缘间隙。
输出的区域包含杯关闭的区域。
(感觉是对边缘的扩充)derivate_gauss( Image : DerivGauss : Sigma, Component : )watersheds( Image : Basins, Watersheds : : )从图像中提取风水岭。
zero_crossing( Image : RegionCrossing : : )零交点(二次导数)diff_of_gauss( Image : DiffOfGauss : Sigma, SigFactor : )近似日志算子( 拉普拉斯高斯) 。
laplace_of_gauss( Image : ImageLaplace : Sigma : )拉普拉斯高斯edges_color_sub_pix( Image : Edges : Filter, Alpha, Low, High : )精确的亚像素边缘提取(彩色图像)edges_sub_pix( Image : Edges : Filter, Alpha, Low, High : )精确边缘提取的亚像素(灰度图像)edges_color( Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )根据颜色进行边缘提取edges_image( Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )边缘提取skeleton( Region : Skeleton : : )计算区域的框架Skeleton == Regionfrei_amp( Image : ImageEdgeAmp : : )Frei-chen模板进行边缘检测(振幅)frei_dir( Image : ImageEdgeAmp, ImageEdgeDir : : ) Frei-chen 模板进行边缘检测(振幅和方向)nonmax_suppression_dir( ImgAmp, ImgDir : ImageResult : Mode : )使用方向图像抑制所有的超过给定最大值的图像灰度值的点gen_contours_skeleton_xld( Skeleton : Contours : Length, Mode : ) 将系统框架转换成XLD轮廓laplace( Image : ImageLaplace : ResultType, MaskSize, FilterMask : )使用有限差分计算拉普拉斯变换info_edges( : : Filter, Mode, Alpha : Size, Coeffs )估计滤波器的宽度kirsch_dir( Image : ImageEdgeAmp, ImageEdgeDir : : )使用Kirsch算子计算出边缘(振幅和方向)prewitt_amp( Image : ImageEdgeAmp : : )使用Prewitt 算子计算出边缘(振幅)kirsch_amp( Image : ImageEdgeAmp : : ) 使用Kirsch 算子计算出边缘(振幅)highpass_image( Image : Highpass : Width, Height : )从高频成分提取的图像。
Halcon算子笔记3_相机标定+矫正图像

Map_image.hdev: 矫正图像*关闭窗口dev_close_window ()dev_close_window ()*打开指定大小、颜色背景的窗口dev_open_window (0, 0, 768/2, 576/2, 'black', WindowHandle1)dev_update_pc ('off')dev_update_window ('off')dev_update_var ('off')dev_update_time ('off')dev_set_draw ('margin')dev_set_line_width (3)** Calibrate the camera.(标定相机)步骤一** 标定板描述文件CaltabName := 'caltab_big.descr'* make sure that the file 'CaltabDescrName' is in the current directory,* the HALCONROOT/calib directory, or use an absolut path*初始相机参数:焦距、畸变系数Kappa,Sx,Sy,Cx,Cy,ImageWidth,ImageHeight StartCamPar := [0.008,0,0.0000086,0.0000086,384,288,768,576]*物体在空间坐标系中的位姿数组NStartPose := []*行角点数组NRow := []*列角点数组NCol := []*X、Y、Z从标定表文件获取计算值caltab_points (CaltabName, X, Y, Z)*创建空的图像元组gen_empty_obj (Images)*图像的数目NumImages := 10*接下来for循环,依次读取、处理NumImages张图像for I := 1 to NumImages by 1*读取图像:Image得到图像数据read_image (Image, 'calib/calib-3d-coord-'+I$'02d')*将单个Image加入元组Images中concat_obj (Images, Image, Images)*显示Imagedev_display (Image)*在图像中找到标定板的区域:图像,标定板描述文件,滤波核大小,二值化值find_caltab (Image, Caltab, CaltabName, 3, 112, 5)*设置区域颜色:绿色dev_set_color ('green')*显示图像中标定板的区域dev_display (Caltab)*(核心函数:搜寻图像的原始点)在图像中找到标定板的各个角点坐标和初始位姿find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, 128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)*设置颜色:红色dev_set_color ('red')*在窗口上圆形标记角点的位置disp_circle (WindowHandle1, RCoord, CCoord, gen_tuple_const(|RCoord|,1.5))*一个图像位姿加入位姿元组NStartPose := [NStartPose,StartPose]*所有图像角点行坐标数组相连NRow := [NRow,RCoord]*所有图像角点列坐标数组相连NCol := [NCol,CCoord]endfordev_update_time ('on')disp_continue_message (WindowHandle1, 'black', 'true')stop ()** Calculate the mapping.(计算带矫正信息的图像)步骤二**(核心函数)标定相机参数,对步骤一的数据进行计算处理camera_calibration (X, Y, Z, NRow, NCol, StartCamPar, NStartPose, 'all', CamParam, NFinalPose, Errors)*生成空的对象:包含矫正映射信息的图像gen_empty_obj (Maps)*for循环一次处理一组对应的图像for NumImage := 1 to NumImages by 1* Obtain the pose of the calibration table.*获取标定出来的位姿3DPose := NFinalPose[(NumImage-1)*7:(NumImage-1)*7+6]*设置新的原始3D位姿set_origin_pose (Pose, -1.125, -1.0, 0, PoseNewOrigin)*(核心函数)生成带矫正映射信息的图像MapSinglegen_image_to_world_plane_map (MapSingle, CamParam, PoseNewOrigin, 768, 576, 900, 800, 0.0025, 'bilinear')*将单张图像加入图像元组Mapsconcat_obj (Maps, MapSingle, Maps)endfordisp_continue_message (WindowHandle1, 'black', 'true')stop ()*代码到此处:有了NumImages张标定的原图+ NumImages张带矫正映射信息的图像,*接下来While循环,一张一张的矫正图像** Map the images.(矫正图像)步骤三**窗口设置dev_open_window (0, 391, 900/2, 800/2, 'black', WindowHandle2)Button := 0NumImage := 1while (Button # 1)dev_set_window (WindowHandle1)dev_set_part (0, 0, 575, 767)dev_clear_window ()*从图像元组中选择一张图像select_obj (Images, Image, NumImage)*显示选择的图像dev_display (Image)disp_message (WindowHandle1, 'Press any mouse button to stop', 'image', -1, -1, 'black', 'true')*选择对应位置的带矫正信息的图像select_obj (Maps, MapSingle, NumImage)*(核心函数)矫正图像:原图,带矫正信息图,矫正结果图map_image (Image, MapSingle, ImageMapped)*以下为窗口、循环之类的处理,与图像处理没什么关系dev_set_window (WindowHandle2)dev_set_part (0, 0, 799, 899)dev_clear_window ()dev_display (ImageMapped)NumImage := NumImage + 1if (NumImage > NumImages)NumImage := 1endifdev_error_var (Error, 1)dev_set_check ('~give_error')get_mposition (WindowHandle1, R, C, Button)dev_error_var (Error, 0)dev_set_check ('give_error')if (Error#H_MSG_TRUE)Button := 0endifif (Button)breakendifendwhiledev_set_window (WindowHandle2) dev_close_window ()。
halcon相机标定方法

halcon相机标定方法【实用版3篇】《halcon相机标定方法》篇1Halcon相机标定方法可以采用以下步骤:1. 确定畸变系数。
畸变系数表示相机成像过程中的畸变程度,其值介于0和0.00001之间。
在标定过程中,需要确定畸变系数。
2. 确定标定板。
标定板是用于相机标定的已知几何信息的板状物体。
标定板通常由一系列等边直角三角形组成,每条边上都有四个角,共12个点。
这些角可以用于计算相机的内部参数和畸变系数。
3. 获取标定板图像。
获取标定板图像并将其输入到Halcon中。
4. 提取角点信息。
使用Halcon中的“find_features”函数来提取标定板图像中的角点信息。
该函数将自动检测图像中的角点,并返回其坐标和类型。
5. 计算相机内部参数。
使用提取的角点信息,结合Halcon中的“find_feature_points”函数和“find_feature_matches”函数,可以计算相机的内部参数和畸变系数。
6. 验证标定结果。
为了验证标定结果,可以使用Halcon中的“check_calib”函数来检查相机内部参数和畸变系数是否正确。
以上是Halcon相机标定的基本步骤。
《halcon相机标定方法》篇2Halcon相机标定方法有:1. 传统六点标定法。
这种方法是通过一个平面上的六个点的位置来确定整个平面的几何参数,进而求得相机的内参数。
2. 棋盘格标定法。
棋盘格标定法是通过棋盘格上两组对应点的几何约束,解算出相机的畸变系数。
3. 标定板标定法。
《halcon相机标定方法》篇3Halcon相机标定方法有以下几个步骤:1. 建立棋盘格点在Halcon中,建立棋盘格点需要指定格点在图像中的实际坐标,这样可以正确计算出畸变系数。
如果只指定棋盘格在图像中的尺寸和数量,那么在畸变计算时会返回默认的(通常是不可靠的)畸变系数。
建立棋盘格点的方法如下:`2x2 to picture :诤友棋盘格(squareSize:[20,20], gridNum:25)`2. 确定相机位置和方向这里有两种方法:方法一:建立一个动态的目标,不断改变目标与相机的距离和角度,然后计算目标的成像位置,从而得到相机的位置和方向。
(学习笔记)摄像机模型与标定标定函数

(学习笔记)摄像机模型与标定——标定函数摄像机内参数,能够让我们将3D坐标转换为2D图像坐标。
说明:要理解下面的函数中参数的真实用法还需要阅读一下相机标定程序。
摄像机标定函数:[cpp] view plaincopyvoid cvCalibrateCamera2( CvMat* object_points, CvMat* image_points, int* point_counts, CvSize image_size, CvMat* intrinsic_matrix, CvMat* distortion_coeffs, CvMat* rotation_vectors = NULL,CvMat* translation_vectors = NULL, int flags = 0 );1、object_points,是一个N×3的矩阵,如果对于每一个棋盘,我们有k个角点,并且我们通过旋转棋盘,得到棋盘的M的视场图,那么此时N=k×M。
在使用棋盘的场合,我们另点z的坐标值为0,而x,y坐标用里面来度量,选用英寸单位,那么所有参数计算的结果也是用英寸表示。
类似地,如果设置所有x坐标为0(而不是z 坐标),那么意味着与摄像机相关的棋盘位置将主要在x方向上而不是在z方向上。
棋盘上的正方形定义了一个单位,即如果正方形的边长为90mm,那么物体和摄像机坐标单位应该是mm/90。
最简单的方式是我们定义棋盘的每一个方块为一个单位。
2、image_points,是一个N×2的矩阵。
包含object_points 所提供的所有点的坐标。
即算法在图像中寻找到的角点的坐标。
3、point_counts,每个图像上角点的个数,以M×1矩阵形式提供,M是视场的数目4、image_size,图像的大小,以像素为衡量单位。
5、intrinsic_matrix,摄像机内参数矩阵3×3大小。
Halcon学习(二十一)摄像机标定常用函数(二)

Halcon学习(⼆⼗⼀)摄像机标定常⽤函数(⼆)1.read_cam_par( : : : )从⽂件夹中读取相机的内参数。
2.disp_caltab( : : , , , , : )利⽤相机内外参数,把标定板模型投影到图像平⾯,显⽰标定点和连接线,X,Y轴也被显⽰出来。
3.vector_to_pose( : : , , , , , ,, : , )计算世界坐标和图像坐标之间关系的绝对位姿参数。
其中世界坐标⾄少选择不在同⼀条直线上的三个点。
世界坐标上的点如果在⼀个平⾯上,应该选择'planar_analytic'作为Method的参数。
输出位姿和位姿质量。
4.write_pose( : : , : )把位姿写⼊TXT⽂件。
5.get_mbutton( : : : , , )返回⿏标点击的图像点像素坐标,以及⿏标按钮值,左键0,中间键2,右键4.6.image_points_to_world_plane( : : , , , , : ,)把图像坐标转化成Z=0平⾯的世界坐标,输出为世界坐标的X,Y7.pose_to_hom_mat3d( : : : )把3D位姿转化成齐次变换矩阵。
8.affine_trans_point_3d( : : , , , : , , )进⾏两个坐标系之间的3D坐标的仿射变换。
/ Qx \ / Px \| Qy | = HomMat3D * | Py || Qz | | Pz |\ 1 / \ 1 /9.project_3d_point( : : , , , : , )把3D点映射到图像坐标系,返回图像坐标系中该点的⾏列坐标。
10.smallest_rectangle2( : : : , , , , )返回包含⼀个区域的最⼩环绕矩形。
11.gen_measure_rectangle2( : : , , , , , , , : )返回和矩形边垂直的边缘。
12.measure_pairs( : : , , , , :, , , , ,, , )抽取和矩形边垂直的边缘对。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Halcon学习(二十二)摄像机标定(函数详解)TmpCtrl_AllMarkRows := []TmpCtrl_AllMarkColumns := []TmpCtrl_StartPoses := []TmpCtrl_ReferenceIndex := 0StartParameters :=[0.008,0,5.2e-006,5.2e-006,640,512,1280,1024]for Index := 0 to |ImageFiles|-1 by 1read_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]endforcaltab_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 1read_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的值越大,边缘检测的灵敏度也就越高,这将使边缘检测时找到更多的细节,但同时对噪声的抑制能力下降。
在边缘图像中,提取出封闭的轮廓线。
为了更准确的寻找轮廓线,对边缘的振幅进行一个阀值操作。
所有振幅高的点(标定点的边界)都被选中。
首先,这个阀值设置为StartThresh。
如果寻找封闭轮廓线或估计位姿失败,这个阀值接连地减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:进行数组选择。