技术研究之单目测距
1.前言
最近在弄无人机的项目,其中的一个就是目标检测,在检测到目标物体之后,如何获取到目标物体离当前无人机的距离,然后快速发现问题经纬度坐标,这是一个问题。主要分为了:单目测距和双目测距。
单目测距
单目测距主要依靠图像中物体的几何信息来进行距离估计。常用的方法包括三角测量法、景深测量法和结构光测量法。三角测量法基于物体在图像中的尺寸和位置信息,结合相机的内外参数进行距离估计。景深测量法利用图像中物体的模糊程度来反映物体的远近关系,通过对焦距离的调整来估计距离。结构光测量法则利用投影仪投射特定的光纹到物体上,通过获取投影图像和物体表面的形变信息来计算距离。双目测距
双目摄像头的原理与人眼相似。人眼能够感知物体的远近,是由于两只眼睛对同一个物体呈现的图像存在差异,也称“视差”。物体距离越远,视差越小;反之,视差越大。视差的大小对应着物体与眼睛之间距离的远近,这也是3D电影能够使人有立体层次感知的原因。
【1】.用普通摄像头测量距离 近年来,由于无人机、无人车等技术的不断成熟,需要用到实时测距的场所也越来越多,如定位,避障,测速等,相比于其他测距方法,单目测距是利用一个摄像头进行视频拍摄,在图像中找到待测物体。
【2】.使用OpenCV实现摄像头测距 需要先测量出目标物体的实际宽度和目标物体到相机的距离,然后使用图像处理的方法自动计算图片中目标物体的像素宽度,并使用相似三角形计算出相机的焦距。根据相机的焦距就可以计算图片中的目标物体到相机的距离。用 cv2.findContours 函数找到图片中的众多轮廓,然后获取其中面积最大的轮廓,并假设这是目标物体的轮廓。
这种假设只适用于我们这个场景,在实际使用时,在图片中找出目标物体的方法与应用场景有很大关系。我们这个场景用简单的边缘检测并找出最大的轮廓就可以了。当然为了使程序更具有鲁棒性,也可以用轮廓近似,并剔除不是四个点的轮廓(纸张是一个有四个点的矩形),然后再找出面积最大,具有四个点的轮廓。
【3】.单目测距的基本介绍和实现原理 单目测距主要依靠图像中物体的几何信息来进行距离估计。常用的方法包括三角测量法、景深测量法和结构光测量法。三角测量法基于物体在图像中的尺寸和位置信息,结合相机的内外参数进行距离估计。景深测量法利用图像中物体的模糊程度来反映物体的远近关系,通过对焦距离的调整来估计距离。结构光测量法则利用投影仪投射特定的光纹到物体上,通过获取投影图像和物体表面的形变信息来计算距离。
【4】.双目测距原理
【5】.双目相机测距原理 1.视差测量;2.立体重建;3.距离测量;4.精度提高。
【6】.一种单目视觉测距方法
【7】.单目测距双目测距杂篇
【8】.OpenCV与AI深度学习 | 使用单相机对已知物体进行3D位置估计 在计算机视觉中,有很多方法可以找到物体的3D位置,例如使用立体摄像头、激光雷达、雷达等。但有时仅用单个摄像头就可以实现3D感知。使用单相机找到3D位置的一个条件是,需要知道图片中需要估计位置的物体的大小。请记住,当对象的方向发生变化时,图片中的对象可能会具有不同的大小。在本文中,为了避免这种需要我们了解对象方向的复杂性,我们将尝试估计球的 3D 位置。因为一个球,无论从任何方向看,都具有相同的大小。
【9】.基于图像识别的物体位移测量方法、装置及系统
2.相机标定
相机标定就是通过代码,获取相机的焦距。将摄像机固定位置,在一米远处固定另外一个黑底的黑板,上面放一张白色的A4纸,然后拍摄照片,类似于下图。为了测试方便,还可以使用不同的已知距离,分别拍摄不同的三张照片,最后进行验证。我综合了 Python-OpenCV的单目视觉测距 (这里的代码和我修改的代码差不多,这里有中文代码注释。)和 单目摄像机测距(python+opencv) (这里有两种方法,一种通过固定位置拍摄,一种是通过摄像头拍摄,这里还结合了人像检测的代码)两篇文章,些了下面的代码。
read_photo
固定摄像头和 A4 纸的距离为 50cm 拍摄一张照片,然后执行 read_photo函数,左上角显示摄像机焦距。read_camera
固定 A4 纸,移动摄像头到距离 A4 纸50厘米的地方,这个时候左上角显示的就是摄像机的焦距。
1 | #!usr/bin/python |
【1】.YOLOv5+单目测距(python) 这篇文章和下面一篇文章比较相似。
【2】.YOLO 单目测距:原理、方法与代码 1.使用摄像机采集道路前方的图像;2.在道路区域对物体进行检测,通过矩形框将物体形状框出来。3.
结合矩形框信息,找到该矩形框底边的两个像平面坐标,分别记为(u1,v1)和(u2,v2);4.使用几何关系推导法,由像平面坐标点(u1, v1)、(u2, v2)推导出道路平面坐标(x1,y1)、(x2, y2);(投影到地面上,z轴为0);5.通过欧氏距离公式计算出d。
【3】.单目测距原理与实现(代码可运行) 从单目测距,到yolov7单目测距,还有深度检测到改进。这里提到了一个onocular_Distance_Velocity_Detect 进行识别和标定距离的例子。缩写的代码和我上面的不太一致。
【4】.YOLOv7+单目测距(python) 1.相关配置。2.测距原理。3.相机标定。4.相机测距。
【5】.[OpenCV实战]38 基于OpenCV的相机标定 这里用一个棋盘进行了相机的标定,包括 c++ 和 python 代码,通过多张照片的形式,获取到了相机的参数。
3.人员检测
1 |
3.误差
如果相机和被测物体不在同一水平线上,有一定的角度,这个该如何处理误差呢?
【1】.【单目测距】已知相机角度如何测距
无人机
针对摄像机的单目测距,误差可能会小一点,但是对于无人机这种运动的物体,那么测量的距离还有角度,就可能不准了。
【1】.一种基于无人机运动平台的单目测距精度计算方法 这里搭建了一个无人机运动平台进行了测量。
【2】.一种基于单目视觉和测距信息融合的无人机避障方法
【3】.一种使用无人机进行测距测量的方法和装置