首页 > 编程知识 正文

超声波测距实验电路图,超声波测距matlab仿真

时间:2023-05-04 16:50:40 阅读:36084 作者:104

双目测距的基本原理

如上图所示,双目测距主要利用目标点直接存在于成像于左右两个视图中的横坐标中的差异,即,视差与从目标点到成像面的距离z呈反比关系。 Z=fT/d。 “@ scyscyao :在opencv中,f的维度是像素点,t的维度由缩放盘棋盘格的实际大小和用户输入值决定,一般以毫米为单位(当然为了提高精度,也可以设定为0.1毫米级) 因此,分子分母约去,z的维数与t相同。 ”

如果左视图中目标点的坐标为(x,y ),左右视图中形成的视差为d,以左摄像机的光的中心为原点的世界坐标系中的目标点的坐标为(x,y,z ),则q * [ xy D1 ]’=[ xyzw ]’

“@scyscyao :为了正确求出某一点在三维空间中的距离z,需要得到焦距f、视差d、照相机中心间距离Tx。 另外,需要取得x坐标和y坐标时,还需要追加知道左右图像平面的坐标系和立体坐标系中的相对于原点的偏移cx和cy。 其中f是,

Tx、cx和cy可以通过立体标定获得初始值,通过立体校准进行优化,两个摄像机在数学上完全平行排列,且左右摄像机的cx、cy和f相同。 也就是说,实现图2的左右视图完全平行对准的理想形状。 立体匹配的工作是,在前面,求出视差d这个最后的变量。 这个d一般需要子像素精度。 最终求出一个点的三维坐标所需的准备完毕。 在明确了上述原理之后,我们知道所有这些步骤。 标定、校准、匹配以更准确获取f的方法为中心

专为d、Tx、cx、cy而设计。 ”

二.相机缩放

摄像机标定通常需要放置在摄像机前面的特殊校准参照物(棋盘纸),摄像机获取该物体的图像,计算摄像机的内外参数。 基准物上各特征点相对于世界坐标系的位置在创建时必须准确测量,世界坐标系可以选择为基准物的物体坐标系。 得到这些已知点在图像上的投影位置后,可以计算照相机的内外参数。

如上图所示,照相机根据光学镜头特性在成像中存在径向变形,能够通过3个参数k1、k2、k3决定; 由于组装上的误差,传感器和光学镜头之间不完全平行,因此成像存在切线畸变,可以由两个参数p1、p2决定。 各个照相机缩放,主要是照相机的内参(焦距f和成像原点cx、cy、5个失真参数)一般只需要计算k1、k2、p1、p2,对于鱼眼镜头等径向失真特别大的镜头需要计算k3 OpenCV中使用的求焦距和成像原点的算法是基于深蓝色松鼠的方法(),求失真参数的方法是基于Brown的方法)。

1 .图像坐标系、相机坐标系和世界坐标系的关系

照相机建立几何关系,其中的Oc点称为照相机(镜头)的光学中心,Xc轴和Yc轴平行于图像的x轴和y轴,Zc轴是照相机的光轴,其垂直于图像平面。 光轴与图像平面的交点O1为图像坐标系的原点。 由点Oc和Xc、Yc、Zc轴构成的坐标系称为相机坐标系,OcO1的距离作为相机焦距,用f表示。

图像坐标系是也被称为像平面的二维平面,“@scyscyao :实际上是照相机的CCD传感器的表面。 每个CCD传感器都有一定的大小和一定的分辨率,这决定了毫米和像素点之间的转换关系。 举个例子,照相机的尺寸是8mm

如果X 6mm和帧屏幕分辨率设置为640X480,则毫米和像素点之间的转换关系为80像素X 6mm。 ”如果将CCD传感器的各像素点的物理大小设为dx*dy,则dx=dy=1/80。 他是怎么计算的? )

2 .进行相机缩放时,棋盘格实际大小square_size (默认值为1.0f )的设置是否会影响缩放参数?

“@scyscyao :当然有。 标定时,必须指定棋盘格的长度。 该长度(通常以毫米为单位,需要更准确地设定为0.1毫米级时)与实际长度相同,标定结果可用于实际距离测量。 一般地,如果正确设置尺寸,则从立体定位获得的平移向量的第一分量Tx的绝对值是左右摄像机的中心距离。 一般可以用它验证立体标定的正确性。 例如,我设定的棋盘大小是270

(27mm ),最终得到的Tx大小为602.8(60.28mm ),相当准确。 ”

3 .通过缩放得到的摄像机内参数,即焦距和原点坐标,其数值单位一致吗? 如何将焦距数值转换为实际物理量?

“@wobject :是的,全部以像素为单位。 设像素点的大小为kl,单位为mm,则fx=f/k,fy=f/(l*Sina ),a一般假定为90,指照相机坐标系的失真度(透镜坐标和CCD是否垂直)。 照相机矩阵(内参)的目的是将图像的点从图像坐标转换为实际的物理三维坐标。 其中的fx,

fy、cx、cy均使用上述纲量。 同样,q的变量f、cx、cy也应该相同。 ”

4 .板图像数

目应该取多少对摄像头定标比较适宜?

OpenCV中文论坛上piao的帖子《在OpenCV中用cvCalibrateCamera2进行相机标定(附程序) 》中指出影响摄像头定标结果的准确性和稳定性的因素主要有三个:

(1) 标定板所在平面与成像平面(image plane)之间的夹角;

(2) 标定时拍摄的图片数目(棋盘图像数目);

(3) 图像上角点提取的不准确。

感觉OpenCV1.2以后对图像角点的提取准确度是比较高的,cvFindChessboardCorners 和 cvFindCornerSubPix结合可以获得很好的角点检测效果(hqhuang1在《[HQ]角点检测(Corner

Detection) cvFindCornerSubPix 使用范例 》中给出了相关的应用范例)。因此,影响定标结果较大的就是标定板与镜头的夹角和棋盘图像数目,在实际定标过程中,我感觉棋盘图像数目应该大于20张,每成功检测一次完整的棋盘角点就要变换一下标定板的姿态(包括角度、距离)。

5. 单目定标函数cvCalibrateCamera2采用怎样的 flags 比较合适?

由于一般镜头只需要计算k1,k2,p1,p2四个参数,所以我们首先要设置 CV_CALIB_FIX_K3;其次,如果所用的摄像头不是高端的、切向畸变系数非常少的,则不要设置 CV_CALIB_ZERO_TANGENT_DIST,否则单目校正误差会很大;如果事先知道摄像头内参的大概数值,并且cvCalibrateCamera2函数的第五个参数intrinsic_matrix非空,则也可设置 CV_CALIB_USE_INTRINSIC_GUESS ,以输入的intrinsic_matrix为初始估计值来加快内参的计算;其它的

flag 一般都不需要设置,对单目定标的影响不大。

P.S. 使用OpenCV进行摄像机定标虽然方便,但是定标结果往往不够准确和稳定,最好是使用 Matlab标定工具箱 来进行定标,再将定标结果取回来用于立体匹配和视差计算。工具箱的使用官方主页 有图文并茂的详细说明,此外,有两篇博文也进行了不错的总结,推荐阅读:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。