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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么把python模型部署到线上_如何将机器学习模型成功部署到.Net环境中

【IT168 技术】Python和R语言是在数据工程师间最流行的编程语言,但是,它并不能适用于应用程序构建的所有部分。这也就是你为什么有时需要找到一种方法,将Python或R编写的机器学习模型部署到基于.NET等语言的环境中。本文将为大家展示如何使用…

刚刚上班才回来,今天和你说说hash数组

hash算法: 专门接受一个字符串,并计算出一个尽量不重复的编号。相同字符串,计算出的号一定相同!不同字符串,计算的号几乎不相同。 添加元素时: 将下标名称交给hash算法,计算出一个唯一的序号,将值保存到数组…

C++ set insert的返回值

pair<iterator,bool> insert (const value_type& val); 返回布尔对以表示是否发生插入&#xff0c;如果重复插入一个元素会返回false。返回迭代器指向新插入元素。

【GNN】一份完全解读:是什么使神经网络变成图神经网络?

图1&#xff1a;来自(Bruna等人&#xff0c;ICLR&#xff0c;2014)的图&#xff0c;描绘了3D领域内的MNIST图像。虽然卷积网络很难对球面数据进行分类&#xff0c;但是图网络可以很自然地处理它。可以把它当做是一个处理工具&#xff0c;但在实际应用程序中会出现许多类似的任务…

TTU智能配电终端_分布式dtu智能配电终端10KV配网自动化专用介绍

SGE300FD 系列分布式配电自动化终端&#xff08;以下简称装置&#xff09;采用了先进的数字信号处理技术、高速工业网络通信技术、嵌入式工业芯片组和多任务实时操作系统&#xff0c;稳定性强、可靠性高、实时性好、环境性广、功能强大、维护简易、操作方便。与20KV及以下电压等…

python程序员怎么面试_Python程序员面试,这些问题你必须提前准备!

近些年随着Python语言越来越流行&#xff0c;越来越多的人选择Python语言作为自己的职业方向。如何在心仪公司的面试中获得好成绩&#xff0c;并最终成功获得offer是每一个Python开发者都要慎重对待的事情&#xff0c;如下是笔者整理的Python程序员在面试中经常被问到的问题&am…

C++ priority_queue对链表节点建立小根堆

链表的节点为&#xff1a; struct ListNode {int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}}; 首先对链表节点建立一个结构体&#xff0c;结构体包含节…

python基础学习1-内置函数

#!/usr/bin/env python # -*- coding:utf-8 -*- 系统内置函数n abs(-1) #绝对值 print(n)#bytes()函数 s"离开" re bytes(s,encoding"utf-8") # bytes() 把字符串 转换成字节 print(re)res str(re,encoding"utf-8") #转换回字符串 print(res) …

数学与 AI「融通」 ,徐宗本院士进行超强“迁移学习”

来源&#xff1a; AI科技评论 编辑 | 唐里徐宗本院士在数学与 AI 之间进行了一次超强的“迁移学习”。9 月 21 日至 22 日&#xff0c;为期两天的 CCAI 2019 正在秋意浓浓的中国青岛胶州隆重举行。本次会议选址室外体育馆召开&#xff0c;为原本严肃的学术会议增添了几分活泼、…

mac怎么合并两个容器_Mac怎么合并文件夹?macz不容错过的苹果mac教程分享

关于合并文件夹&#xff0c;与Windows操作不同的是&#xff1a;Mac中很可能会出现文件丢失。 因为它对相同名称文件的实际操作是替换而不是另命名复制&#xff01;你的Mac电脑是否有重复文件想要合并&#xff1f;想了解Mac电脑合并文件夹而不丢失文件&#xff1f;那一定不要错过…

C++ 指向子类的指针转型为指向父类类型指针之后指向的对象地址不变

C 指向子类的指针转型为指向父类类型指针之后指向的对象地址不变 例子&#xff1a; class A{int a;int b; };class B:public A{int c; };int main(){B* pnew B();cout<<p<<endl;cout<<static_cast<A*>(p)<<endl;return 0; }

JMX学习笔记(一)-MBean

JMX学习笔记(一)-MBean 标签&#xff1a; jmxstringjavainterfaceexceptionclass2010-12-07 22:20 15360人阅读 评论(5) 收藏 举报分类&#xff1a;JMX&#xff08;11&#xff09; JMX 即 Java Management Extensions Java管理扩展MBean 即 managed beans …

关于大脑未必是破解智能和意识之谜的钥匙探讨

来源&#xff1a;刘锋的未来课堂“人脑能创造11维结构”是瑞士的研究机构蓝脑&#xff08;Blue Brain&#xff09;的一个研究结论&#xff0c;蓝脑&#xff08;Blue Brain&#xff09;研究所主要目标是建立一个由超级计算机驱动的人脑模型。这篇短文主要是由《崛起的超级智能》…

结构化分析和面向对象分析的区别 例子_管理游戏测评例子

在测评中心技术中&#xff0c;有一个非常有趣的场景的模拟测评&#xff0c;打造敏捷高绩效团队&#xff0c;提高执行力(包括人才测评)&#xff0c;旨在帮助学生培养自主性&#xff0c;了解自己&#xff0c;以独立的意见做出决策&#xff0c;采取果断的行动&#xff1b;培养赋权…

C++获取多维数组维数

#include <iostream> using namespace std;int main(void) { int a[3][4];cout<<sizeof(a)/sizeof(a[0])<<endl; //3cout<<sizeof(a[0])/sizeof(a[0][0])<<endl; //4return 0; }

python编程购物车_python编写购物车新写法

用另一种方式完成购物车的功能实现#!/usr/bin/pythonzijin input("请输入资金&#xff1a;")if zijin.isdigit():zijin int(zijin)else:print("请输入数字&#xff01;")exit_flag Falseprint("欢迎来到本人的购物小店".center(40,"-&qu…

qtablewidget 选中不改变背景_C4D制作不一样的核壳结构

在科研绘图中&#xff0c;三维模型图相对于二维平面图片可以展示更多的信息&#xff0c;尤其是在做纳米结构设计和制备时&#xff0c;三维模型图可以直观地表现出材料的设计思路和合成路径。比如在这篇发表于Joule杂志的高水平、高颜值、将纳米美学展现的淋漓尽致的paper中(Ref…

Ubuntu学习小结(一) 基础知识,系统安装,软件安装,解压缩

这段时间&#xff0c;抽空研究了一下Ubuntu&#xff0c;虽然也有过到目前为止使用计算机最作死的经历&#xff0c;但目前已经学会了一些最基本的操作。在这里简单的记录一下&#xff0c;算是吸取的教训&#xff0c;供其他人借鉴。 1.装Ubuntu系统。装Ubuntu系统的网上教程很多&…

城科会刘朝晖:从互联网大脑模型看城市大脑

刘朝晖中国城市科学研究会城市大数据专业委员会副主任委员中国生态城市研究院首席科学家按照凯文凯利的观点&#xff0c;技术体和生命体都是一种进化现象。刘锋博士的《崛起中的超级智能》显然秉承了类似的视角&#xff0c;基于哲学高度和宇宙现象对我们这个时代正在爆发的人工…

docker如何部署python项目_Docker如何部署Python项目的实现详解

Docker 是一个开源项目&#xff0c;为开发人员和系统管理员提供了一个开放平台&#xff0c;可以将应用程序构建、打包为一个轻量级容器&#xff0c;并在任何地方运行。Docker 会在软件容器中自动部署应用程序。IBV免费资源网在本篇中&#xff0c;我将介绍如何 docker 化一个 Py…