工业相机测距开发:基础篇
Posted 神佑我调参侠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工业相机测距开发:基础篇相关的知识,希望对你有一定的参考价值。
前言
我们在之前完成了对rect的提取,工业相机的使用,那么接下来就可以测距了,本文章利用相似三角形来进行测距,然后下一篇文章会用到pnp测距,那么现在开始!
利用相似三角形来进行测距
原理讲解
相信大家在初中应该都学习过相似三角形,那么具体应用之前,我们得先知道小孔成像的一些事情,我们使用的相机是针孔相机,然后可以看下下面这个图
然后的话就是公式的应用:f/d = h1/h2
代码实现
/*******************************************************************
函数名: void Distance::get_f()
作用: 获取相机的“焦距”(相对的),使用相似三角形进行求解
细节: 这个就类似于标定,是很重要的,要反复测量
*******************************************************************/
void Distance::get_f()
for(unsigned int x = 0;x<(armors.size());x++)
//1.求出在图像上的物体的长度
double photo_object_big = armors[x].tl().y - armors[x].br().y;
//2.测出实际物体的长度
double object_big = 2.1 ;
//3.测出实际距离
double orign_distance = 91.5;
//4.利用公式求解f
f = (photo_object_big/object_big)*orign_distance;
cout<<"f: "<<f<<endl;
测试
刚才进行了几次的测试,怎么说呢,开始的时候我是用y做差,但是得出的数据特别抖,然后我就改为用x做差,然后发现对于指定的距离确实挺准的,那其实按照原理来说应该很准呀,导致不准的原因无外乎就是标定的时候出现的误差,所以说这种有主观上误差的确实很难用,要想客服这种误差,没有好的办法,只能大量的测量,否则就换方法,其实相似三角形的优势很明显,但是劣势也很明显,那么有没有一种方法可以在主观上将这种误差降到最低的呢!我们得进行科学的方法呀!
知识补充
要想要真正的准确的实现一个事,就要有大量的科学依据,更重要的是要有知识储备,下面我们来补充一下这些知识:
- 位置
- 姿势
- 坐标系
- 等等
齐次坐标
参考:https://zhuanlan.zhihu.com/p/258437902
我们先来学习一下齐次坐标的知识:
透视投影
参考:https://baike.baidu.com/item/%E9%80%8F%E8%A7%86%E6%8A%95%E5%BD%B1/9995986?fr=aladdin
透视投影是用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。它具有消失感、距离感、相同大小的形体呈现出有规律的变化等一系列的透视特性,能逼真地反映形体的空间形象。,下面我们来看下面这个图:
它是从某个投射中心将物体投射到单一投影面上所得到的图形。且透视投影是中心投影的一种。
我们要知道一个知识点:通过透视投影可以将像素尺寸转化成物理尺寸
相机方面的知识
原理
参考:https://blog.csdn.net/heroacool/article/details/50286677,https://blog.csdn.net/weixin_41855010/article/details/108394275,https://zhuanlan.zhihu.com/p/144307108,https://blog.csdn.net/xueluowutong/article/details/80950915
我们这里使用的是张正友标定法,我们必须要明白的一件事是相机标定是非常重要的,是平面视觉到立体视觉的关键,也是让不科学的测量有了科学的依据。
方法有两种,第一种就是摄影测量标定法,就是我们上面用到的差不多的方法,最大的问题就是要用精度很高的设备和测量起来非常繁琐。第二种方法就是自标定:这种方法是在静态场景里移动摄像机,通过图像信息来完成标定。但是有很多的参数需要估计。张正友标定法:通过从不同的方位观测标定板来实现,是我们下面要讲解的方法。
但我们实践取得到内参的时候会使用matlab工具
然后在真正去了解之前,我们要对基础知识进行大量的补充
坐标系
这里面涉及到几个坐标系,下面我会以一个真实的物体如何成像来具体说明:
世界坐标系:说白了就是我们在现实中参照物体和摄像机位置的坐标系,可以就是以地面为xy面,垂直面为z面,然后科学的表示如下:
然后我们就得了解相机坐标系:与成像平面坐标系的x轴和y轴平行,轴为摄像机的光轴,和图像平面垂直。光轴与图像平面的交点为图像主点O’,由点O与轴组成的直角坐标系称为摄像机坐标系。OO’为摄像机焦距。如下面这下面这个图:
同时这里就引出了成像坐标系,只是规定了图像的位置,但是具体的像素点的位置并不知道,以上单位都是物理单位,这里引出了图像坐标系,以图像的左上角为原点,并且单位为像素。
坐标系转换
参考:https://zhuanlan.zhihu.com/p/75076326
了解了各个坐标系后,我们就得了解各个坐标系之间的关系。
像素坐标转换成成像面坐标
然后我们得知道像素坐标系是以左上角为中心,而成像坐标系是以图像的中心为中心,然后我们用数学公式来得到(x,y):
这个得到的矩阵就是我们所说的相机的内参。
成像物理坐标转化成相机坐标
参考:https://zhuanlan.zhihu.com/p/90295867
首先我们先来看一下相机坐标系的定义:以相机的光心为原点,以光轴为z轴,以图像的平面为xy平面
这步转换要用到上面我们说的齐次坐标了,因为这里涉及到了2维到3维。
相机坐标系到世界坐标系
这个转换也是非常重要的,首先我们要先了解到两者的原点是不同的,前者的原点是相机的光心,后者的原点我们假设为子午线上的一点,那么两者转换的话首先就会涉及到一个平移的问题,3个坐标轴都会转化,所以需要3个数,我们在这里写成向量的形式就是平移向量t。
经常情况下,我们也会涉及到旋转,那么这里我们会使用到一个叫做旋转矩阵的东西,这里具体的推导过程可以看一下b站上的东南大学的老师讲的机器人运动学中的位姿那个视频,就1,2节,并不长。这里就不细说了
这里是用一个二维的举例,三维的也是这么计算,就是投影和正余弦定理一些数学方面的运用。
所以综上我们得出这个矩阵:
然后在使用的时候我们是通过调用opencv 的函数来求出外参的,通过外参就可以得到我们想用的东西了。
相机内参的获取
我们获取的方式是利用matlab来获取,网上的教程很多,这里我就不再写了了,放上我认为写的不错的博客:https://blog.csdn.net/heroacool/article/details/51023921
以上是关于工业相机测距开发:基础篇的主要内容,如果未能解决你的问题,请参考以下文章