halcon单摄像机标定
- 格式:doc
- 大小:35.00 KB
- 文档页数:2
基于HALCON软件的摄像机标定作者:闫霞牛建强来源:《数字技术与应用》2010年第11期摘要:摄像机标定是机器视觉的重要研究内容之一,提出了一种基于图像处理软件HALCON的标定方法。
它利用HALCON标定板以及HALCON的函数库功能,分析了对面阵摄像机的标定过程,该方法简单易行,提高了标定精度和计算速度,而且具有良好的跨平台移植性。
关键词:摄像机标定机器视觉 HALCON 标定板中图分类号:TP391 文献标识码:A 文章编号:1007-9416(2010)11-0112-03Camera Calibration Based On HALCON SoftwareYanXia1 NiuJianQiang1(1.Department of Electronic Information Engineering, Henan University of Science And Technology,Luoyang He’nan 471003,China)Abstract:Camera calibration is one of the important research content in Machine vision, a method based on image processing software HALCON is suggested in this paper. It use calibration plate of HALCON and function of library , analyzed camera calibration process of the array camer, this method is simple and it improves the calibration precision and computation speed, and it has a good cross-platform portability。
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算子笔记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实现双目立体视觉系统,以及立体视觉的基本理论、方法和相关技术,为搭建双目立体视觉系统和提高算法效率提供了参考。
关键词双目视觉三维重建立体匹配摄像机标定视差双目立体视觉是机器视觉的一种重要形式,它是基于视差原理并由多幅图像获取物体三维几何信息的方法。
双目立体视觉系统一般由双摄像机从不同角度同时获得被测物的两幅数字图像,或由单摄像机在不同时刻从不同角度获得被测物的两幅数字图像,并基于视差原理恢复出物体三维几何信息,重建物体三维轮廓及位置。
双目立体视觉系统在机器视觉领域有着广泛的应用前景。
HALCON是在世界范围内广泛使用的机器视觉软件。
它拥有满足您各类机器视觉应用需求的完善的开发库。
HALCON也包含Blob分析、形态学、模式识别、测量、三维摄像机定标、双目立体视觉等杰出的高级算法。
HALCON支持Linux和Windows,并且可以通过C、C++、C#、Visual Basic和Delphi语言访问。
另外HALCON与硬件无关,支持大多数图像采集卡及带有DirectShow和IEEE 1394驱动的采集设备,用户可以利用其开放式结构快速开发图像处理和机器视觉应用软件。
一.双目立体视觉相关基本理论介绍1.1 双目立体视觉原理双目立体视觉三维测量是基于视差原理,图1所示为简单的平视双目立体成像原理图,两摄像机的投影中心的连线的距离,即基线距为b。
摄像机坐标系的原点在摄像机镜头的光心处,坐标系如图1所示。
事实上摄像机的成像平面在镜头的光心后,图1中将左右成像平面绘制在镜头的光心前f处,这个虚拟的图像平面坐标系O1uv的u轴和v轴与和摄像机坐标系的x轴和y轴方向一致,这样可以简化计算过程。
Halcon相机标定简介相机标定简介⾸先镜头有畸变,也就是说照出的图像与实际不符产⽣了形变。
即使⼯业镜头也是有千分之⼏的畸变率的。
上个图告诉⼤家畸变这个图⾥,第⼀个图就是我们相机下的真实的形状,后边两个就是照出来有畸变的图⽚。
其次镜头与相机⽆论你的机械结构精度多⾼,也不容易或者说没办法将相机安装的特别正,那相机安装不正也是会导致误差的。
⼤家想知道具体数学模型的话可以搜⼀下相机标定的理论⽅⾯的知识,我侧重怎么做。
标定就是把上述两个东西转化成正常的。
⽆论是在图像测量或者机器视觉应⽤中,相机参数的标定都是⾮常关键的环节,其标定结果的精度及算法的稳定性直接影响相机⼯作产⽣结果的准确性。
深度说明1、相机标定参数介绍内参:确定摄像机从三维空间到⼆维空间的投影关系。
针孔相机(FA镜头相机)模型为6个参数(f,kSx,Sy,Cx,Cy);远⼼镜头相机模型为5个参数(f,Sx,Sy,Cx,Cy);线阵相机为11个参数(f,k,Sx,Sy,Cx,Cy,Width,Highth,Vx,Vy,Vz)。
其中:f为焦距;k表⽰径向畸变量级。
如果k为负值,畸变为桶形畸变,如果为正值,那么畸变为枕形畸变。
Sx,Sy是缩放⽐例因⼦。
对于相机(FA镜头)表⽰图像传感器⽔平和垂直⽅向上相邻像素之间的距离,初始值与真实值越接近计算速度越快。
对于远⼼摄像机模型,表⽰像素在世界坐标系中的尺⼨。
Cx,Cy是图像的主点,对于相机,这个点是投影中⼼在成像平⾯上的垂直投影,同时也是径向畸变的中⼼。
对于远⼼摄像机模型,只表⽰畸变的中⼼。
Vx,Vy,Vz:线阵相机必须与被拍摄物体之间有相对移动才能拍摄到⼀幅有⽤的图像。
这是运动向量。
Sx,Sy对于线阵相机是相邻像元的⽔平和垂直距离。
2、标定板详细介绍问题1:halcon是否只能使⽤halcon专⽤的标定板?halcon提供了简便、精准的标定算⼦与标定助⼿,这在实际使⽤中极⼤地⽅便了使⽤者在halcon中有两种标定⽅式:halcon⾃带例程中出现的,⽤halcon定义的标定板,如下图:⽤户⾃定义标定板,⽤户可以制作任何形状、形式的标定板,如下图:所以,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. 确定相机位置和方向这里有两种方法:方法一:建立一个动态的目标,不断改变目标与相机的距离和角度,然后计算目标的成像位置,从而得到相机的位置和方向。
Halcon单相机标定板标定⾸先得到相机的内参gen_cam_par_area_scan_division (0.012, 0, 0.00000375, 0.00000375, 640, 480, 1280, 960, StartCamPar)普通的畸变:’area_scan_division’ [’area_scan_division’, Focus, Kappa, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight⾼精度畸变(多项式⼦):’area_scan_polynomial’ [’area_scan_polynomial’, Focus, K1, K2, K3, P1, P2, Sx, Sy, Cx, Cy, ImageWidth, ImageHeight然后建⽴标定对象:create_calib_data ('calibration_object', 1, 1, CalibDataID)//建⽴标定对象set_calib_data_cam_param (CalibDataID, 0, [], StartCamPar)//设置相机的参数set_calib_data_calib_object (CalibDataID, 0, 'calplate_80mm.cpd')//设置标定板的⽂件//查找标定板NumImages := 7for I := 1 to NumImages by 1read_image (Image, ImgPath + 'calib_image_' + I$'02d')dev_display (Image)find_calib_object (Image, CalibDataID, 0, 0, I, [], [])get_calib_data_observ_contours (Caltab, CalibDataID, 'caltab', 0, 0, I)get_calib_data_observ_points (CalibDataID, 0, 0, I, Row, Column, Index, StartPose)//获取标定板的位姿dev_set_color ('green')dev_display (Caltab)dev_set_color ('red')disp_circle (WindowHandle, Row, Column, gen_tuple_const(|Row|,1.5))endfor//纠正实际世界坐标位姿set_origin_pose (Pose, 0, 0, 0.002, Pose)//由于标定板的厚度是0.02,所以Z平移到相机坐标需要加上0.02//标定相机calibrate_cameras (CalibDataID, Errors)//标定相机get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam)//得到相机标定后的相机内参,这个内参包含了畸变参数get_calib_data (CalibDataID, 'calib_obj_pose', [0,1], 'pose', Pose)//以第⼀张图作为参考平⾯,得到参考平⾯的坐标位姿//坐标转换image_points_to_world_plane (CamParam, Pose, Row, Col, 'mm', X1, Y1)//将相机平⾯映射到实际坐标位置位姿:描述是世界坐标转换到相机坐标的旋转平移参数,也就是该点在相机坐标系下的位姿。
相机标定1 相机标定基本原理1.1 相机成像模型目前大多数相机模型都是基于针孔成像原理建立的,因为针孔成像原理简单,并且能满足建模的要求。
除此之外还有基于应用歪斜光线追踪法和近轴光线追踪法的成像模型[1]。
针孔成像虽然已经展示出了相机的成像原理,但是由于针孔成像是理想的物理模型,没有考虑相机本身的尺寸、镜头与相机轴心的偏斜等因素的影响,因此精度很低,不能满足工业机器视觉的要求。
为了使相机模型能高精度的反应相机的实际成像过程,需要再针孔成像模型的基础上考虑镜头畸变等的因素。
图1 针孔成像基于针孔成像原理建立的相机的成像模型,如下图所示。
在相机的成像模型中,包含有几个坐标系分别是世界坐标系、相机坐标系、图像坐标系,相机的成像过程的数学模型就是目标点在这几个坐标系中的转化过程。
图2 针孔成像模型(1)世界坐标系(X w,Y w,Z w),就是现实坐标系,是实际物体在现实世界中的数学描述,是一个三维的坐标空间。
(2)摄像机坐标系(X c, Y c),以针孔相机模型的聚焦中心为原点,以摄像机光学轴线为Z c轴(3)图像坐标系:分为图像像素坐标系和图像物理坐标系为了便于数学描述将图像平面移动到针孔与世界坐标系之间。
如下图所示。
图3 将相机平面移至针孔与目标物体之间后的模型1.2 坐标系间转换从世界坐标系到相机坐标系:P(X c ,Y c ,Z c )=R(α,β,γ)∗P(X w ,Y w ,Z w )+T每一个世界坐标的对象都可以通过旋转和平移转移到相机坐标系上。
将目标点旋转θ角度,等价于将坐标系方向旋转θ。
如下图所示,是二维坐标的旋转变换,对于三维坐标而言,旋转中绕某一个轴旋转,原理实际与二维坐标旋转相同。
如果,世界坐标分别绕X ,Y 和Z 轴旋转α,β,γ,那么旋转矩阵分别为R (α),R (β),R (γ)图4 坐标旋转原理R (α)=[1000cosα−sinα0sinαcosα] (1-1) R (β)=[cosβ0sinβ010−sinβ0cosβ] (1-2)R (γ)=[cosγsinγ0−sinγcosγ0001] (1-3)总的旋转矩阵就是三者的乘积:R(α,β,γ)=R (α)∗R (β)∗R(γ)平移矩阵T =(t x ,t y ,t z ),t x ,t y ,t z 是世界坐标系原点与摄相机坐标系原点之间的差值。
Halcon学习(二十一)摄像机标定常用函数(二)1.read_cam_par( : : CamParFile : CameraParam)从文件夹中读取相机的内参数。
2.disp_caltab( : : WindowHandle, CalTabDescrFile, CameraParam, CaltabPose, ScaleFac : )利用相机内外参数,把标定板模型投影到图像平面,显示标定点和连接线,X,Y轴也被显示出来。
3.vector_to_pose( : : WorldX, WorldY, WorldZ, ImageRow, ImageColumn, CameraParam,Method , QualityType : Pose, Quality)计算世界坐标和图像坐标之间关系的绝对位姿参数。
其中世界坐标至少选择不在同一条直线上的三个点。
世界坐标上的点如果在一个平面上,应该选择'planar_analytic' 作为Method的参数。
输出位姿和位姿质量。
4.write_pose( : : Pose, PoseFile : )把位姿写入TXT文件。
5.get_mbutton( : : WindowHandle : Row, Column, Button)返回鼠标点击的图像点像素坐标,以及鼠标按钮值,左键0,中间键2,右键4.6.image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X,Y)把图像坐标转化成Z=0平面的世界坐标,输出为世界坐标的X,Y7.pose_to_hom_mat3d( : : Pose : HomMat3D)把3D位姿转化成齐次变换矩阵。
8.affine_trans_point_3d( : : HomMat3D, Px, Py, Pz : Qx, Qy, Qz)进行两个坐标系之间的3D坐标的仿射变换。
In the reference manual,operator signatures are visualized in the following way:
operator ( iconic input : iconic output : control input : control output )
在HALCON所有算子中,变量皆是如上格式,即:图像输入:图像输出:控制输入:控制输出,其中四个参数任意一个可以为空。
控制输入量可以是变量、常量、表达式,控制输出以及图像输入和输入必须是变量,以存入算子计算结果中。
1.caltab_points:从标定板中读取marks中心坐标,该坐标值是标定板坐标系统里的坐标值,该坐标系统以标定板为参照,向右为X正,下为Y正,垂直标定板向下为Z正。
该算子控制输出为标定板中心3D坐标。
2.create_calib_data:创建Halcon标定数据模型。
输出
一个输出数据模型句柄。
3.set_calib_data_cam_param:设定相机标定数据模型中设置相机参数的原始值和类型。
设置索引,类型,以及相机的原始内参数等。
4.set_calib_data_calib_object:在标定模型中设定标定对象。
设定标定对象句柄索引,标定板坐标点储存地址。
5.find_caltab:分割出图像中的标准标定板区域。
输出为标准的标定区域,控制
6.find_marks_and_pose:抽取标定点并计算相机的内参数。
输出MARKS
坐标数组,以及估算的相机外参数。
即标定板在相机坐标系中的位姿,由3个平移量和3个旋转量构成。
7.set_calib_data_observ_points( : : CalibDataID, CameraId x, CalibObjIdx,CalibObjPoseIdx, Row, Column, Index, Pose
: )
收集算子6的标定数据,将标定数据储存在标定数据模型中。
输入控制分别为标定数据模型句柄,相机索引,标定板索引,位姿索引,行列坐标,位姿。
8.calibrate_cameras( : :CalibDataID:Error)标定一台或多台相机,依据CalibDataID中的数据。
控制输出平均误差。
9.get_calib_data( : :CalibDataID,ItemType,ItemIdx,DataN ame:DataValue)获得标定数据。
依靠索引号和数据名称来返回输出的数据值。
可查询与模型相关的数据,与相机相关的数据(包括相机的内外参数等),与标定对象相关的数据,与标定对象的姿态相关的数据。
控制输出是要查询的标定数据。
如:get_calib_data (CalibDataID, 'camera', 0, 'params', CamParam) //查询相机的位姿
get_calib_data (CalibDataID, 'calib_obj_pose', [0, NumImage], 'pose', Pose) //查询标定板位姿
10.write_cam_par( : :CameraParam,CamParFile: )记录相机的内参数,输入控制为内参数,输出控制为
存取相机内参数的文件名。
11.set_origin_pose( : :PoseIn,DX,DY,DZ:PoseNewOrigin)
设置新的坐标原点,控制输入为原始的位姿和沿着世界坐标系的三个坐标轴的平移量,控制输出为新的位姿。