原文链接:https://blog.csdn.net/weixin_43197380/article/details/90438976#comments_13104885

一、理论

为什么要进行单相机标定?

广义:畸变矫正和一维和二维测量

  • 畸变矫正:
            在几何光学和阴极射线管(CRT)显示中。畸变是对直线投影的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。那畸变简单来说就是一条直线投影到图片上不能保持为一条直线了。这是一种光学畸变(optical aberration)。畸变是一种相差,可能由于摄像机镜头导致,会对拍摄的物体的形状产生变化,影响测量。
            我自己对畸变矫正的理解就是,当相机进行标定时,虽然标定板也产生了畸变,但是标定板(圆形)的准确数据我们已经告诉了halcon,比如,圆的排列方式、直径、中心距等。通过加载多张标定板图片,halcon可以通过函数求出镜头里发生畸变的标定板与未发生畸变的标定板之间的映射关系,也就是相机本身的内参(拍摄有畸变)和矫正之后无畸变内参之间的映射关系,将这种映射关系作用到拍摄时发生畸变的物体当中,就完成了畸变校正.。
    步骤:
    1)通过标定求出相机内参。
    2)通过有畸变的内参求出无畸变的内参。用chage_radial_distortion_cam_par()函数完成。
    3)求出有畸变的内参和无畸变的内参之间的映射关系。用
          gen_radial_distortion_map()函数
    4)将上边的映射关系作用到产生畸变的物体当中,完成畸变校正
  • 一维和二维的测量
            图片上的尺寸是像素距离,标定后,可以求出像素距离与物理空间距离的换算关系,从而计算出实际的物理尺寸。

狭义:求解相机的内参和外参以及畸变参数,得到二维平面像素坐标和三维世界坐标的关系,从而进行三维重建。

  • 相机内参:相机的固有属性,在进行畸变校正时需要用到相机的内参。
  • 相机外参:物体在经过透镜成像之后,实际上是经过了旋转和平移,而外参就是告诉我们物体成像后经过了那种旋转和平移,相机的外参包括平移矢量和旋转矩阵。
  • 畸变参数:采用理想针孔模型,由于通过针孔的光线少,摄像机曝光太慢,在实际使用中均采用透镜,可以使图像生成迅速,但代价是引入了畸变。有两种畸变对投影图像影响较大: 径向畸变和切向畸变。

相机的畸变和内参是相机本身的固有特性,标定一次即可一直使用。但由于相机本身并非理想的小孔成像模型以及计算误差,采用不同的图片进行标定时得到的结果都有差异。一般重投影误差很小的话,标定结果均可用。

为什么要求解相机的内参和外参?

首先,我们需要知道四个坐标系,即图像像素坐标系 (u,v)、图像物理坐标系(x,y)、相机坐标系(Xc,Yc,Zc)和 世界坐标系(Xw,Yw,Zw)(标定板所在的坐标系)。

一、像素坐标系(u,v)与CCD的图像物理坐标系(x,y)的关系:

像素坐标系不利于坐标变换,因此需要建立图像坐标系XOY,其坐标轴的单位通常为毫米(mm),原点是相机光轴与相面的交点(称为主点),即图像的中心点。X轴、Y轴分别与u轴、v轴平行。故两个坐标系实际是平移关系,即可以通过平移就可得到。

  • 两坐标轴互相垂直


       此时有:
                                        
其中,dX、dY分别为像素在X、Y轴方向上的物理尺寸,u0,v0为主点(图像原点)坐标。

这里引用了齐次矩阵(就是将一个原本是2维的x,y向量用一个3维向量(加个1)来表示),引入齐次矩阵的目的主要是合并矩阵运算中的乘法和加法,表示为x=P*X的形式。即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法

  • 两坐标轴不互相垂直
                                        
    此时有
                            
    写成矩阵形式:

二、相机坐标系(Xc,Yc,Zc)与图像坐标系(x,y)的关系:

根据小孔成像原理:
                                               
        如图,空间任意一点P与其图像点p之间的关系,P与相机光心o的连线为oP,oP与像面的交点p即为空间点P在图像平面上的投影。

该过程为透视投影,根据三角形相似性原理得如下矩阵:
                                                  
其中,s为比例因子(s不为0),f为有效焦距(光心到图像平面的距离),(x,y,z,1)T是空间点P在相机坐标系oxyz中的齐次坐标,(X,Y,1)T是像点pp在图像坐标系OXY中的齐次坐标。

三、世界坐标系(Xw,Yw,Zw)至相机坐标系(Xc,Yc,Zc)
                                              
   
其中:R为3* 3的旋转矩阵,T为3*1的平移矩阵,(xc,yc,zc,1)T为相机坐标系的齐次坐标,(xw,yw,zw,1)T为世界坐标系的齐次坐标。

四、世界坐标系转化为像素坐标系
                      
                      
其中,M1称为相机的内部参数矩阵,完全由相机的内部参数ax,ay,uo,vo决定,(uo,vo)为主点坐标,ax,ay分别表示图像u轴和v轴的尺度因子;M2完全由摄像机相对于世界坐标系的方位决定,称为摄像机的外部参数;Xw为空间点在世界坐标系下的齐次坐标;M为一个3*4的矩阵,称为投影矩阵。

总结:其实说白了,我们需要找到世界坐标系和像素坐标系之间的关系,而两者的关系可以通过将世界坐标系转化为相机坐标系,相机坐标系通过投影变换转化为CCD的图像物理坐标系,在通过变换可以把图像物理坐标系的物理单位转化为图像像素坐标系的像素单位[即(x,y)→(u,v)],从而得到世界坐标系和像素坐标系之间的关系,即通过A->B,B->C,C->D之间的关系,找到A->D的关系。
       要想找到世界坐标系到像素坐标系之间的转换关系,必须要求出相机内参,外参,而标定就是求相机内外参的过程,通过求得的内外参,达到对成像物体的一、二维测量和畸变矫正的目的。

二、标定流程

实现的原理是根据相机的像元尺寸、焦距和标定板的描述文件(.descr)来找到显示的标定板图像上面的标志点,从而确定标定板实际输入的参数(Distance、Diameter等)和这些参数对应的图像像素大小的关系,完成标定。

这里我用的标定板是7*7圆点标定板,型号:HC070—3.75


标定板数据可参考:


标定步骤:

1)使用gen_caltab算子生成一个标定文件

标定前需要生成一个.descr的描述文件,也就是世界坐标系与像素坐标系的关系,当我们下一次做别的项目时,只需要调用描述文件,即可完成标定过程。
        生成标记文件的算子:gen_caltab (7, x方向的标记数;
                                                          7, y方向的标记数;
                                                          0.0075, 标记点圆心之间的距离,单位:米;
                                                          0.5, 标记点直径与标记点圆心之间距离的比值;
                                                          ‘C:/Users/Administrator/Desktop/caltab.descr’,标定板的描述文件的保存路径;
                                                          ‘caltab.ps’,描述标定板的一些信息,打印标定板时会用到)

2)打开标定助手,加载标定文件,设置相机参数(单个像元宽高(问相机厂商或看手册),相机焦距)


3)实时获取各个角度、位置的标定板图片(9-16张左右),并选择其中一种图片设置参考位姿,然后标定。


可以看到相机的参数:


4)保存相机内、外参,下次使用测量助手直接调用内外参文件。



   
 
单独说一下如何进行畸变校正,可以接上面的第三步之后:生成标定数据(相机内、外参)代码,从而进行畸变校正

代码:

*相机内参
CameraParameters := [0.0375147,-270.806,8.30152e-006,8.3e-006,647.48,520.914,1280,960]
*相机位姿,即外参(旋转矩阵+平移矢量)
CameraPose := [-0.0091626,-0.00625214,0.700967,2.46926,358.933,179.443,0]
*1、校正径向畸变,得到新的相机内参
change_radial_distortion_cam_par ('adaptive', CameraParameters, 0, CamParamOut)
stop ()* Image Acquisition 02: Code generated by Image Acquisition 02
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'CAMERA_QBY_DM', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)grab_image_async (Image, AcqHandle, -1)*2、对发生径向畸变的图像生成投影映射,图像的映射数据存在第一个参数中gen_radial_distortion_map (Map, CameraParameters, CamParamOut, 'bilinear')*3、对图像进行畸变校正map_image (Image, Map, ImageMapped)
endwhile
close_framegrabber (AcqHandle)
注意:相机标定之后,相机焦距、上下位置不能再动,否则需要重新标定。 

 三、实战:以一元硬币为例
1、 打开测量助手,加载上面得到的相机内、外参

2、.进行快速测量,可以看到最后测量结果24.1232mm 
3、生成代码后,加入上面的畸变校正,即可完成完整的标定过程
 3. Measure 01: Code generated by Measure 014. Measure 01: Initialize acquisition
open_framegrabber ('GigEVision', 0, 0, 0, 0, 0, 0, 'default', -1, 'default', -1, 'false', 'default', 'CAMERA_QBY_DM', 0, -1, AcqHandle)5. Measure 01: Initialize calibration
CameraParameters := [0.0220788,-613.469,6.00309e-006,6e-006,613.491,509.255,1280,960]
CameraPose := [-0.00464111,-0.00298404,0.341764,2.05327,359.502,89.9295,0]
*1、校正径向畸变,得到新的相机内参
change_radial_distortion_cam_par ('adaptive', CameraParameters, 0, CamParamOut)
stop ()6. Measure 01: Prepare measurement
AmplitudeThreshold := 40
RoiWidthLen2 := 25
set_system ('int_zooming', 'true')7. Measure 01: Coordinates for line Measure 01 [0]
LineRowStart_Measure_01_0 := 495.5
LineColumnStart_Measure_01_0 := 385.5
LineRowEnd_Measure_01_0 := 498.167
LineColumnEnd_Measure_01_0 := 745.58. Measure 01: Convert coordinates to rectangle2 type
TmpCtrl_Row := 0.5*(LineRowStart_Measure_01_0+LineRowEnd_Measure_01_0)
TmpCtrl_Column := 0.5*(LineColumnStart_Measure_01_0+LineColumnEnd_Measure_01_0)
TmpCtrl_Dr := LineRowStart_Measure_01_0-LineRowEnd_Measure_01_0
TmpCtrl_Dc := LineColumnEnd_Measure_01_0-LineColumnStart_Measure_01_0
TmpCtrl_Phi := atan2(TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 := 0.5*sqrt(TmpCtrl_Dr*TmpCtrl_Dr + TmpCtrl_Dc*TmpCtrl_Dc)
TmpCtrl_Len2 := RoiWidthLen29. Measure 01: Create measure for line Measure 01 [0]10. Measure 01: Attention: This assumes all images have the same size!
gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 1280, 960, 'nearest_neighbor', MsrHandle_Measure_01_0)
while (true)* Measure 01: Acquire imagegrab_image (Image, AcqHandle)* Measure 01: Execute measurements*2、对发生径向畸变的图像生成投影映射,图像的映射数据存在第一个参数中gen_radial_distortion_map (Map, CameraParameters, CamParamOut, 'bilinear')*3、对图像进行畸变校正map_image (Image, Map, ImageMapped)measure_pos (ImageMapped, MsrHandle_Measure_01_0, 19.5, 40, 'all', 'all', Row_Measure_01_0, Column_Measure_01_0, Amplitude_Measure_01_0, Distance_Measure_01_0)* Measure 01: Transform to world coordinates* Measure 01: Calibrate positions for Measure 01 [0]image_points_to_world_plane (CameraParameters, CameraPose, Row_Measure_01_0, Column_Measure_01_0, 0.001, Column_World_Measure_01_0, Row_World_Measure_01_0)* Measure 01: Calibrate distancesTmpCtrl_Length := |Row_World_Measure_01_0|if (TmpCtrl_Length > 0)tuple_select_range (Row_World_Measure_01_0, 0, TmpCtrl_Length - 2, TmpCtrl_RowFrom)tuple_select_range (Column_World_Measure_01_0, 0, TmpCtrl_Length - 2, TmpCtrl_ColumnFrom)tuple_select_range (Row_World_Measure_01_0, 1, TmpCtrl_Length - 1, TmpCtrl_RowTo)tuple_select_range (Column_World_Measure_01_0, 1, TmpCtrl_Length - 1, TmpCtrl_ColumnTo)distance_pp (TmpCtrl_RowFrom, TmpCtrl_ColumnFrom, TmpCtrl_RowTo, TmpCtrl_ColumnTo, Distance_World_Measure_01_0)endif* Measure 01: Do something with the results
endwhile11. Measure 01: Clear measure when done
close_measure (MsrHandle_Measure_01_0)

Halcon 单相机标定相关推荐

  1. Halcon单相机标定—标定板标定和自标定 线扫相机标定

    一.标定板标定 13.0 ************************************************************************************* * ...

  2. Halcon之单相机标定

    Halcon之单相机标定Halcon之单相机标定Halcon之单相机标定 相机的标定就是通过获取相机的内外参数,来纠正畸变和获取物理尺寸 纠正了畸变,测量才会准确(测量项目一般都需要考虑纠正畸变) 标 ...

  3. 使用halcon助手进行单相机标定,发生结果焦距总不准确问题的解决方法

    问题:在使用halcon标定助手进行单相机标定,多次标定的标定结果产生焦距误差较大且不稳定的问题,进而影响后续相机进行测量使用的问题 解决方法: 1.根据镜头视野大小选择合适大小的标定板,要保证进行标 ...

  4. halcon相机标定助手_Halcon 学习笔记---单相机标定(2)

    一.单项机标定原因 降低畸变(相差) 测量 二.相机标定求出什么 该方程是求取世界坐标系与像素坐标系之间转换矩阵,本质就是求出相机的内外参数.其中dx和dy为每个像素在图像坐标系(UVO)沿U和V方向 ...

  5. 0019_畸变矫正(单相机标定)

    畸变: 图像形状发生了变形(本来是直线,变成了向内凹或者向外凸的弧线) 单相机畸变矫正的处理步骤: 1. 使用标定板,在halcon中使用标定助手,得到相机的内外参数 可以将内外参数据生成到halco ...

  6. halcon面阵相机标定矫正

    使用标定助手标定过程很简单就不赘述了,可以自行查找,无非就是生成描述文件=>填写相机像元参数,镜头参数,标定板参数=>拍照=>标定即可 例如标定后得到的参数为 相机内参 => ...

  7. [Halcon标定] 单相机标定

  8. Halcon 单目标定,畸变矫正,图像坐标系转世界坐标系

    代码为Halcon代码,只有代码以及解释,默认已经理解世界坐标系(WCS)到相机坐标系(CCS)到图像坐标系(ICS)到像素坐标系(PCS)转换 *********************1. 标定内 ...

  9. HALCON单目标定

    标定之前需要提前准备好的是标定板(如果用笔记本电脑提前尝试但是没有标定板,下面有步骤会生成ps文件,可以自己打印出来试一试) HALCON有两种标定板 一种是老版的如下图 还有一种是新版的如下 我们要 ...

最新文章

  1. tensorflow---alexnet training (tflearn)
  2. See the World 2015-6-10
  3. 探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤
  4. Robot Framework自动化测试(一)--- 安装
  5. IOS第12天(3,UIViewController的生命周期)
  6. 摘抄《MacTalk 人生元编程》
  7. 3月国内网民地域分布TOP12:广东雄踞榜首 涨幅1.59%
  8. 查询一个表中一个字段相同的数据_最实用MySQL 查询当天、本周,本月、上一个月的数据...
  9. MCP3421高精度ADC转换器
  10. vim编辑器下载Linux版,强大的vim编辑器【下载!linux基础命令豪华版】
  11. 阿里云域名注册和怎么使用(域名解析)
  12. 江苏开票系统安全接入服务器地址,江苏省增值税发票查询平台网址.doc
  13. 【方向盘】2021年JVM生态报告:Java 11使用率超Java 8
  14. bin是什么文件,要如何打开?
  15. 保龄球计分c语言程序,求C语言代码解释(保龄球记分程序)
  16. Windows10安装apt-cyg教程
  17. 《计算机工程》期刊投稿经验分享
  18. Windows电脑如何控制安卓手机
  19. 强子老师python_强子老师分享:深度分析维生素C
  20. 华为公司 代码编码规范

热门文章

  1. 安卓电视机顶盒桌面源码设计分享教程
  2. Brief History of Machine Learning
  3. 动态style中backgroundImage的url无法显示问题
  4. Node.js:pm2管理进程启动npm run dev和开机自启
  5. Windows XP sp3 系统安装 Windbg 符号文件 Symbols 时微软失去支持的解决方案
  6. 阿里技术四面+交叉面+HR面,成功拿到offer
  7. Stable Diffusion背后公司估值攀升至69亿,据项目发布仅过去一个月
  8. PMP【成绩查询】与【申诉】
  9. “年薪 25 万只是白菜价”已成过去式,AI 岗位年薪下降 8.9%,最新薪酬报告发布
  10. 求生之路刷服修改刷服器