c++ opencv 通过网络连接工业相机_摄像头和机器人视觉开发中的「相机标定」,你了解多少?...

目前我们团队在做一个项目,通过采集到的人脸图像测量人脸上两个瞳孔间的实际距离。注意是实际距离,不是两个瞳孔之间隔多少个像素点。找了很久资料,好像“相机标定”可以解决我的问题,看了不少资料来理解【相机标定】张正友博士的论文我看了,百度文库我也看了。

0dbb3893f42ec34a99c06631691527f9.png

相机标定】分为【内标定】与【外标定】,【内标定】得到相机相关的内参数,【外标定】得到相机的外参数,之后还要标定多个相机之间的位置关系。

【相机标定】可以说是计算机视觉/机器视觉的基础,但是初学者不易搞清楚【相机标定】的逻辑是怎样的。下面有感兴趣的朋友可以一起来介绍一下。

80354aeec98b265ce9401e0f2574a067.png

为什么要相机标定?

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。

e0c704b7c5ec8d09dacfcffefd0a8a6e.png

在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为【相机标定或摄像机标定】。 摄像机标定过程,简单的可以简单的描述为通过标定板,经过一系列的矩阵变换得到。

658487cbbf11692d83c027946c4a6417.png

相机标定的目的和意义

我们所处的世界是三维的,而照片是二维的,这样我们可以把相机认为是一个函数,输入量是一个场景,输出量是一幅灰度图。这个从三维到二维的过程的函数是不可逆的。

相机标定的目标是我们找一个合适的数学模型,求出这个模型的参数,这样我们能够近似这个三维到二维的过程,使这个三维到二维的过程的函数找到反函数。

77ff1acf8ba19c3d3335392404bedbf6.png

这个逼近的过程就是【相机标定】,我们用简单的数学模型来表达复杂的成像过程,并且求出成像的反过程。标定之后的相机,可以进行三维场景的重建,即深度的感知,这是计算机视觉的一大分支。

aa05d264bcfa6e16306f9f9e438f4d98.png

相机成像过程的简化与建模

提到相机的成像,从根本上来说,就是在讨论相机的镜头。固定结构的相机镜头决定了一对固定的物像共轭关系,所谓【共轭】,意思是镜头前某个位置的物,它的像一定在镜头后的某个位置,这个关系是固定的。

举个最简单的例子,无穷远处的物必然会在镜头的焦点处成像。这里说的固定结构,指的是镜头的焦距固定,光圈固定。

fa25c3445579d68cef0fc7a58e49936e.png
7756147cc601748794cd6f14140bc6af.png

上图是佳能(Canon)某款摄像机成像原理,我们可以找一个与这个镜头具有相同的物像共轭关系的凸透镜来等效这个镜头,我们把这个凸透镜称作等效透镜,用朝外的双箭头表示。

所以准确的讲把相机的成像过程简化成【针孔相机模型】,只是借用了针孔相机中简单的数学关系来表达一些本来难以表达的数学关系。

70323e9dbfc95b2ca966594debf469f9.png

按我个人的理解,除了焦距固定之外,也应当包含光圈固定,因为改变光圈的大小,除了景深之外,是有可能改变针孔相机模型中的光心位置,但是影响并不是很大。这意味着标定好的相机如果改变光圈大小,会使得标定误差变大但应该不会大到难以接受的地步。

那么这里就引发了两个问题:

(1) 这么多像点和物点到底谁和谁是一对儿?(2) 即便我知道物点在哪里,可是我怎么样用相机坐标系来表达物点的位置 X,Y,Z ?

为了解决上述的两个问题,【标定板】应运而生。标定板的第一大作用,确定物点和像点的对应性。这里用到的原理主要是【透视不变性】,打个比方,你近看一个人和远看一个人,虽然他的鼻子大小变了,你看鼻子的视角也变了,但是拓扑结构肯定是不变的,你也不可能把鼻子看成是嘴巴。

a437339f81ae18b2f35d88a92d8f9373.png

在【标定板】中,印刷了拓扑结构,广泛应用的是【棋盘格】和【圆点格】,这两种之所以成为主流,不仅是因为它们的拓扑结构明确且均匀,更重要的是检测其拓扑结构的算法简单且有效。

93c80275c0202476828f884a3c76f0b7.png

棋盘格检测的是角点,只要对拍摄到的棋盘格图像横纵两个方向计算梯度就可获得;而圆点格的检测只需要对拍摄到的圆点格图样计算质心即可。假如你开发了一套非常完美的检测人脸全部特征的算法,你完全可以用你的照片当作标定板。圆点格的效果应该是好于棋盘格,因为圆点质心的【透视不变性】要比棋盘格的角点稳定的多。

65db7a9d3850037f2bd98f9cc22bb05a.png

如果用OpenCV或Matlab标定工具箱进行标定,需要给出棋盘格的物理尺寸,这其实就是在建立标定板坐标系,从测量的角度讲,标定板的精度是相机标定精度的基准,是误差传递链上的第一个环节。所以为了使针孔相机模型更逼近真实相机,对标定板的质量有以下要求(按重要性顺序):

  1. 标定板的平面度高,棋盘格是直角;
  2. 标定板每个格子尺寸的高一致性;
  3. 真实尺寸与标称尺寸的差异小。
055fd71ac3a2fd39c1e0619bf4198a1c.png

综上所述,我们知道了【相机标定】的重要意义,无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。

94363cab30338b2a7db420d17d05a56f.png

相机标定方法有哪些?

【相机标定】方法有:【传统相机标定法】、【主动视觉相机标定方法】、【相机自标定法】。

【传统相机标定法】需要使用尺寸已知的标定物,通过建立标定物上坐标已知的点与其图像点之间的对应,利用一定的算法获得相机模型的内外参数。

6fcf30c80672dd045c2f57d51f7aab4b.png

根据标定物的不同可分为三维标定物和平面型标定物。三维标定物可由单幅图像进行标定,标定精度较高,但高精密三维标定物的加工和维护较困难。平面型标定物比三维标定物制作简单,精度易保证,但标定时必须采用两幅或两幅以上的图像。传统相机标定法在标定过程中始终需要标定物,且标定物的制作精度会影响标定结果。同时有些场合不适合放置标定物也限制了传统相机标定法的应用。

【基于主动视觉的相机标定法】是指已知相机的某些运动信息对相机进行标定。该方法不需要标定物,但需要控制相机做某些特殊运动,利用这种运动的特殊性可以计算出相机内部参数。基于主动视觉的相机标定法的优点是算法简单,往往能够获得线性解,缺点是系统的成本高、实验设备昂贵、实验条件要求高,而且不适合于运动参数未知或无法控制的场合。

aede9a8c737df9af0b3af62ca666a45a.png

【相机自标定算法】主要是利用相机运动的约束。相机的运动约束条件太强,因此使得其在实际中并不实用。利用场景约束主要是利用场景中的一些平行或者正交的信息。其中空间平行线在相机图像平面上的交点被称为【消失点】,它是射影几何中一个非常重要的特征,所以很多学者研究了基于消失点的相机自标定方法。自标定方法灵活性强,可对相机进行在线定标。

0f17e3c89a48239fa93c88eb3ecbc601.png

【 常用术语】

【内参矩阵】: Intrinsic Matrix

【焦距】: Focal Length

【主点】: Principal Point

【径向畸变】: Radial Distortion

【切向畸变】: Tangential Distortion

【旋转矩阵】: Rotation Matrices

【平移向量】: Translation Vectors

【平均重投影误差】: Mean Reprojection Error

【重投影误差】: Reprojection Errors

【重投影点】: Reprojected Points

【标定板】: Calibration Target 

在机器视觉、图像测量、摄影测量、三维重建等应用中,为校正镜头畸变、确定物理尺寸和像素间的换算关系,通过相机拍摄带有固定间距图案阵列平板、经过标定算法的计算,可以得出相机的几何模型,从而得到高精度的测量和重建结果,而带有固定间距图案阵列的平板就是【标定板】。

a40a656f4648d0e6f550f85134643b90.png

【世界坐标系】:World Coordinate

也称为测量坐标系,是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。

【相机坐标系】: Camera Coordinate

也是一个三维直角坐标系,原点位于镜头光心处,x、y轴分别与相面的两边平行,z轴为镜头光轴,与像平面垂直。

b4c07c1b7375e013eb1e6aafd984c183.png
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!OpenCV是一个开源的计算机视觉库,可以用于图像处理和分析。它支持多种平台和编程语言,并提供了丰富的功能和算法。 要通过海康机器人工业相机使用OpenCV,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了OpenCV库。您可以通过官方网站(https://opencv.org/)下载适合您操作系统的版本,并按照安装指南进行安装。 2. 连接海康机器人工业相机到计算机。这通常需要使用相机的USB、Ethernet或者其他接口进行连接。 3. 使用OpenCV的VideoCapture类来访问相机。您可以创建一个VideoCapture对象,并指定相机的设备索引或者视频文件路径作为参数。例如,如果相机被识别为设备索引0,您可以使用以下代码创建一个VideoCapture对象: ```cpp #include <opencv2/opencv.hpp> int main() { cv::VideoCapture cap(0); // 使用设备索引0访问相机 if (!cap.isOpened()) { std::cout << "无法打开相机" << std::endl; return -1; } // 在这里可以使用OpenCV的其他功能处理相机的帧数据 return 0; } ``` 4. 使用OpenCV的其他功能来处理相机的帧数据。您可以使用VideoCapture对象的read()方法来获取相机的帧数据,并使用其他OpenCV函数进行图像处理、分析等操作。 这只是使用OpenCV通过海康机器人工业相机的基本流程,具体的操作可能因机器人相机型号和OpenCV版本而有所差异。您可以参考OpenCV的文档和海康机器人相机的官方文档来获取更详细的使用方法和示例代码。希望对您有所帮助!如有更多问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值