Halcon学习(二十二)摄像机标定(函数详解)
- 格式:doc
- 大小:29.00 KB
- 文档页数:8
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单相机标定和测量示例相机标定有很多方式:九点标定法、棋盘格标定法、圆形阵列标定法;本次采用圆形阵列标定法。
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函数介绍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 : )从高频成分提取的图像。
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相机标定方法【实用版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学习(⼆⼗⼀)摄像机标定常⽤函数(⼆)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( : : , , , , :, , , , ,, , )抽取和矩形边垂直的边缘对。
基于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相机标定初始值确定富士伺服富士伺服初始参数是0.0195,注意halcon里单位是m k是畸变系数,可以初始为0 sx和sy是相邻像元的水平和垂直距离,1/4"可以查得分别宽和高尺寸是3.2和2.4mm,用320×240去除,得到sx和sy分别是0.01mm,那么应该初始为sx=1.0e-005和sy=1.0e-005,Cx和Cy分别是图像中心点行和列坐标,可以初始化为160和120,最后两个参数是ImageWidth和ImageHeight直接就用320和240。
Halcon 摄像机标定流程摄像机分两种,一种是面扫描摄像机(Area Scan Camera),一种是线扫描摄像机(Line Scan Camera)。
准确来说,叫摄像机系统比较正确。
所谓的面扫描摄像系统是指可以通过单纯曝光取得面积影像,而线扫描摄像机,必须利用运动速度才能取得影像。
两种不同的摄像系统由于成像的过程有区别,所以标定的过程也有区别,这里仅讨论面扫描摄像系统。
流程如下:1、初始摄像机参数:startCamPar:=[f,k,Sx,Sy,Cx,Cy,NumCol,NumRow]f 焦距k 初始为0.0Sx 两个相邻像素点的水平距离Sy 两个相邻像素点的垂直距离Cx、Cy 图像中心点的位置NumCol NumRow图像长和宽2、caltab_points读取标定板描述文件里面描述的点到X[],Y[],z[],描述文件由gen_caltab生成。
3、fin_caltab找到标定板的位置4、find_marks_and_pose 输出标定点的位置和外参startpose5、camera_calibration输出内参和所有外部参数到第五步时,工作已经完成了一半,计算出各个参数后可以用map_image来还原形变的图像或者用坐标转换参数将坐标转换到世界坐标中。
Halcon学习(二十二)摄像机标定(函数详解)基于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 := 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标定计算像素的公式摘要:1.HALCON 相机标定的概念和方法2.HALCON 标定计算像素的公式3.实际应用和优势4.总结正文:一、HALCON 相机标定的概念和方法HALCON 是一种广泛应用于工业领域的机器视觉软件库,它能够帮助用户快速构建图像处理和分析系统。
在实际应用中,由于摄像头拍出来的原始图片存在畸变,我们需要通过标定来矫正这种畸变。
标定分为内参和外参,内参和相机本身的材质等有关,和其它无关,正常情况下只需标定一次即可。
外参和位姿(摄像头和成像平面的相对位置)有关,每次改变都需要重新标定。
二、HALCON 标定计算像素的公式在HALCON 中,标定计算像素的公式主要包括以下几个部分:1.畸变校正:通过设置相机内部参数(如焦距、畸变、像素尺寸等),可以对原始图像进行畸变校正,从而减少图像畸变。
2.创建标定板:在HALCON 中,需要创建一个标定板,用于设置标定板的数据,包括标定板的尺寸、标定板的网格点等。
3.设置相机内部参数的初始值:不同镜头的初始值可能不同,需要根据实际情况设置。
4.计算像素当量:通过放置一个参考物,可以计算出像素当量,从而构建XY 世界坐标系,用于测量、定位等应用。
三、实际应用和优势HALCON 的自标定算子可以在不用标定板的情况下,标定出相机内参(无焦距),相对于多幅标定无法获取相机的外参。
这样设备在现场更容易操作、维护。
此外,HALCON 的自标定算子具有速度快、精度高等优势,可以有效地提高图像处理的准确性和效率。
四、总结总之,HALCON 标定计算像素的公式是一种高效、准确的图像处理方法,它可以帮助用户快速地进行图像标定,提高图像处理的精度和速度。
基于HALCON软件的摄像机标定HALCON是一种非常强大的计算机视觉软件,可以用于许多应用领域,包括自动化、机器视觉、医学成像等。
在这些不同的领域,HALCON用户需要对摄像机进行标定,以便准确地测量和分析图像。
在本文中,我们将探讨如何使用HALCON进行摄像机标定。
摄像机标定的基本原理摄像机标定是计算机视觉中的一个重要过程。
在这个过程中,我们需要找到摄像机内部的一些参数,以便能够准确地测量对象的大小、位置和方向。
这些参数包括内部参数和外部参数。
内部参数包括焦距、畸变和像素距离等,这些参数决定了光学系统如何将世界坐标系中的点映射到图像平面上。
外部参数包括摄像机的位置和朝向,这些参数决定了摄像机如何拍摄场景。
因此,摄像机标定的目标就是确定这些参数。
摄像机标定的步骤摄像机标定通常涉及到摄像机的内部参数和外部参数,因此标定的步骤通常包括两个部分。
第一步是内部参数标定,我们需要用一些已知的三维坐标对摄像机的成像进行测量,得到这些坐标在图像中的投影。
这些点的坐标通常以像素为单位,我们可以使用极线几何或者张正友标定法等方法来求解内部参数。
第二步是外部参数标定,我们需要知道摄像机对于目标的位置和朝向。
通常我们使用标定板或者其他点来测量这些参数。
标定板通常是一个具有已知格子的图案,我们可以测量这些格子在图像中的位置,然后使用PnP算法和非线性优化等数学方法计算摄像机的位置和朝向。
HALCON摄像机标定步骤和代码接下来我们将介绍如何使用HALCON进行摄像机标定。
首先我们需要准备一些标定板或者其他特殊图案。
这些标定板通常由黑白相间的正方形组成,我们需要利用这些正方形来求解内部参数和外部参数。
1. 导入图像首先,我们需要使用HALCON导入摄像机标定所需的图像。
通常我们需要拍摄一系列的标定板图像,这些图像应该包括各种不同的摄像机角度和位置。
这些图像将用于内部参数和外部参数的标定过程。
通常在导入图像之前,需要对图像进行预处理,例如去除噪声和平滑化处理。
详解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并非只能使用专用标定板,也可以使用自定义标定板就可以进行标定。
(学习笔记)摄像机模型与标定——摄像机标定摄像机的内参数:摄像机内参数矩阵(fx,fy,cx,cy)和畸变系数(三个径向k1,k2,k3,两个切向p1,p2)摄像机的外参数:旋转向量(大小为1×3的矢量或旋转矩阵3×3)和平移向量(Tx,Ty,Tz)。
这里我们讲解一下旋转向量:旋转向量是旋转矩阵紧凑的变现形式,旋转向量为1×3的行矢量。
上述公式中r就是旋转向量,1、旋转向量的方向是旋转轴2、旋转向量的模为围绕旋转轴旋转的角度。
通过上面的公式三,我们就可以求解出旋转矩阵R。
同样的已知旋转矩阵,我们也可以通过下面的公式求解得到旋转向量:内参数(fx,fy,cx,cy)与棋盘所在空间的3D几何相关(即外参数)畸变参数则与点集如何畸变的2D几何相关。
1、5个畸变系数的求解:已知模式(我们可以认为是黑色方格,含有四个角点)的三个角点所产生的6组信息(在理论上)可以求解5个畸变参数。
2、内参数fx,fy,cx,cy,和(ψ,φ,θ),(Tx,Ty,Tz)共10个参数的求解将在下面详细讲述。
首先说明:求解上述2中10个参数的前提是先假设每次的畸变参数为0。
求解4个内参数和6个外参数的分析:假设有N个角点和K个棋盘图像(不同位置),需要多少个视场和角点才能提供足够的约束来求解这些参数呢?1、K个棋盘,可以提供2NK的约束,即2NK的方程。
(乘以2是因为每个点都由x和y两个坐标值组成)2、忽略每次的畸变,那么我们需要求解4个内参数和6K个外参数。
(因为对于不同的视场,6个外参数是不同的)3、那么有解的前提是方程的总数应该大于等于未知参数的总数即2NK>=6K+4,或者写成(N-3)K>=2。
为了方便理解,下图是一个3×3大小的棋盘,红色圈标记出了它含有的内角点:如果我们令N=5,K=1,带入到上述不等式,是满足不等式,这就是意味着我们仅需要一个视场和带有5个内角点的棋盘就可以求解出10个参数了。
Halcon-双目视觉系统标定1.get_image_pointer1(Image: : : Pointer, Type, Width, Height)返回第一通道的点,图像数据类型,图像尺寸。
2.disp_image(Image : : WindowHandle : )在输出窗口显示灰度图像3.visualize_results_of_find_marks_and_pose (ImageL, WindowHandle1, RCoordL, CCoordL, StartPoseL, StartCamParL)内部函数,显示初步标定的坐标系和MARKS中心,MARKS中线用十字线标出。
4.set_calib_data_observ_points( : : CalibDataID, CameraIdx, CalibObjIdx, CalibObjPoseIdx, Row, Column, Index, Pose : ) 储存以点为基础的标定观测值,将观测值储存与标定数据句柄中。
5.calibrate_cameras( : : CalibDataID : Error)根据标定数据模型中的值标定摄像机。
6.get_calib_data( : : CalibDataID, ItemType, ItemIdx, DataName : DataValue)查询储存或计算得到的标定模型中的数据。
7.write_cam_par( : : CameraParam, CamParFile : )把相机内参数写入TXT文件8.write_pose( : : Pose, PoseFile : )把相机的位姿写入TXT文件9.gen_binocular_rectification_map( : Map1, Map2: CamParam1, CamParam2, RelPose, SubSampling, Method, MapType: CamParamRect1, CamParamRect2, CamPoseRect1, CamPoseRect2, RelPoseRect)把相机参数和姿态作为输入,输出为校正图像和矫正后的参数和姿态。
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:进行数组选择。