0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用python和opencv实现单目摄像机测距

新机器视觉 来源:CSDN博主O98K 2023-07-03 10:01 次阅读

我的论文方向目前是使用单目摄像头实现机器人对人的跟随,首先单目摄像头与kinect等深度摄像头最大的区别是无法有效获取深度信息,那就首先从这方面入手,尝试通过图像获取摄像头与人的距离。

在网上看了几天关于摄像头标定和摄像头焦距等原理的文章,然后通过这篇文章真正启发了我:用python和opencv来测量目标到相机的距离主要的测距的原理是利用相似三角形计算物体到相机的距离。

在这里我的环境为: Ubuntu14.04 + Opencv2.4.9

一用相似三角形计算物体或者目标到相机的距离

我们将使用相似三角形来计算相机到一个已知的物体或者目标的距离。

相似三角形就是这么一回事:假设我们有一个宽度为 W 的目标或者物体。然后我们将这个目标放在距离我们的相机为 D 的位置。我们用相机对物体进行拍照并且测量物体的像素宽度 P 。这样我们就得出了相机焦距的公式:

F = (P x D) / W

举个例子,假设我在离相机距离 D = 24 英寸的地方放一张标准的 8.5 x 11 英寸的 A4 纸(横着放;W = 11)并且拍下一张照片。我测量出照片中 A4 纸的像素宽度为 P = 249 像素。

因此我的焦距 F 是:

F = (248px x 24in) / 11in = 543.45

当我继续将我的相机移动靠近或者离远物体或者目标时,我可以用相似三角形来计算出物体离相机的距离:

D’ = (W x F) / P

为了更具体,我们再举个例子,假设我将相机移到距离目标 3 英尺(或者说 36 英寸)的地方并且拍下上述的 A4 纸。通过自动的图形处理我可以获得图片中 A4 纸的像素距离为 170 像素。将这个代入公式得:

D’ = (11in x 543.45) / 170 = 35 英寸

或者约 36 英寸,合 3 英尺。

从以上的解释中,我们可以看到,要想得到距离,我们就要知道摄像头的焦距和目标物体的尺寸大小,这两个已知条件根据公式:

D’ = (W x F) / P

得出目标到摄像机的距离D,其中P是指像素距离,W是A4纸的宽度,F是摄像机焦距。

在原文中,是通过预先拍照,根据第一张照片算出摄像头的焦距,在根据已知的焦距算出接下来的照片中白纸到摄像机的距离,这样不太直观,而且需要预先拍照,我将源程序改为实时测距,简单来说就是将原来的读入照片变为读摄像头,这样的效果看起来比较直观.源程序如下:

86b785b0-18dd-11ee-962d-dac502259ad0.jpg

在这张图里我摄像头距离桌面大概100cm,可以看到图中距离为96cm,可以看到精度还可以。

需要注意的是, 如果使用的是opencv3的版本,

1. 需要将find_marker函数中

(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

改为:

(_, cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

因为 In Opencv 3 API version the cv2.findCoutours()returns 3 object

image

contours

hierarchy

2. 需要将:

box = np.int0(cv2.cv.BoxPoints(marker))

改为:


box = cv2.boxPoints(marker)

box = np.int0(box)

以上两个地方是安装不同版本opencv需要修改的地方。

存在的问题:

1. 程序在运行时在未检测到A4纸时有时候会报错:

Traceback (most recent call last): File "video_paper_distance.py", line 86, in marker = find_marker(frame) File "video_paper_distance.py", line 18, in find_marker c = max(cnts, key = cv2.contourArea)

ValueError: max() arg is an empty sequence

目前关于这个错误,我还没有解决,猜测主要是由于没有检测到目标造成max()函数为空的原因,不过没有深究。

2. 程序是通过第一张图已知目标到相机的距离来计算摄像头焦距,然后再通过焦距计算接下来目标到摄像头的距离,在这里焦距是一个关键的参数,所以我准备尝试通过对摄像头的标定直接获取相机的像素焦距,我是通过ros的一个包实现了对相机的标定,不过通过相机标定得出的像素焦距计算出来的距离并没有通过第一张图片计算出的焦距计算出来的距离准确,这个具体原因也没有搞明白,可能是我标定的结果不够准确?

3. 在通过摄像头测距时, 得出的距离也是准确且随着摄像头距离桌面远近而线性变化的,但距离偶尔会出现突变,目前也没找到是什么原因造成的.

ros相机标定主要参考的是这篇博客,博主是白巧克力亦唯心,ROS大神:

ROS 教程之 vision: 摄像头标定camera calibration

这里主要记录的是,通过摄像机标定,得到的3*3的内参数矩阵,其中M[1][1]和M[2][2]分别为我们要求的相机的x,y轴的像素焦距。

二使用相机计算人到相机的距离

在第一部分中我们已经计算出了A4纸距离相机的距离,在具体应用中,我需要计算的是人距离相机的距离,来实现机器人对目标人距离的判断,应用与对目标人的跟随。在这里主要的思路是先通过opencv中的HOG方法检测到人,再根据人的预估身高和摄像头焦距计算人到摄像机的距离。在这里选择身高的原因在于人的身高在不同方向上变化较小,而且我们的摄像头高度是固定的,所以选择身高。

1.首先要使用opencv进行行人检测:

870e4472-18dd-11ee-962d-dac502259ad0.jpg

2.将行人检测与测距代码结合:

875b3444-18dd-11ee-962d-dac502259ad0.png

3.存在的问题:

目前使用HOG检测行人的效果不是很好,会把类似人体形状的物体都框出来,比如实验室的三脚架等物体,受背景干扰较大。程序中存在一个bug就是在没有检测到人时,pix_person_height会为0,这样分母为0时无法计算,在接下来我也要通过3个方面改进,首先要想办法进一步改进人体检测,使用YOLO的方法目前是比较好的,但在CPU下速度较慢。然后要改进的是精度,这里需要主要的是选择摄像头要选择固定焦距的摄像头,自动变焦摄像头焦距会变化,测量的距离也会变。最后就是尽可能完善程序,减少bug。

4 . 将要进行的工作

通过程序可以看到使用单目摄像头检测人到摄像头的距离,其中一个影响较大的因素是对人体的准确检测,如果想要使测量的距离准确(完全准确是不可能的,但要达到可以用于机器人跟随人的功能的程度),那就要尽可能的准确的检测出人,通过我的测试,在准确知道目标人的身高前提下,在离摄像头固定距离上对人拍照,然后手动对人进行画框,标定出目标人的在画面中的高度,通过计算,得到的距离比较准确,其精度完全是可以接受的,所以接下来的工作主要是如何通过程序来准确的框出目标人来获取其在图像中的高度。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    210

    文章

    28266

    浏览量

    206722
  • 摄像头
    +关注

    关注

    59

    文章

    4819

    浏览量

    95526
  • 相机
    +关注

    关注

    4

    文章

    1347

    浏览量

    53541
  • OpenCV
    +关注

    关注

    30

    文章

    629

    浏览量

    41295
  • python
    +关注

    关注

    56

    文章

    4784

    浏览量

    84502

原文标题:单目摄像机测距(python+opencv)

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    网络摄像机是什么?

    (http://www.ztwl.cn/)网络摄像机网络摄像机就是拥有独立的IP地址和嵌入式的操作系统从而实现网络监控的智能化产品。轻此又被叫做IP 摄像机或IP CAMERA。 它可
    发表于 05-26 09:57

    摄像机同步方式

    ,是利用摄像机的交流电源来完成垂直推动同步,即摄像机和电源零线同步。  车载DVR外同步(EXT)利用一个外同步信号发生器产生的同步信号送到摄像机的外同步输入端来实现同步。  同步信号
    发表于 03-04 11:04

    一个VS+OpenCV编写的摄像机采集图像的小程序

    这个程序是在VS2013下编写的,用OpenCv3.00的平台,摄像机是大恒的HV1351UM,只实现了图像的采集,并没有图像处理的功能在里面。
    发表于 03-21 21:07

    网络摄像机与模拟摄像机的区别是什么

    ,另外还可以通过网络来控制摄像机的云台和镜头,进行全方位地监控。  用公式形象表示如下:IP Camera=路DVS+Camera  其次,性能大不同:  第一、清晰度。看得更清是每个用户追求的目标
    发表于 12-11 14:22

    用于网络摄像机\监控摄像机镜头驱动芯片MS41918M-颂扬恒科技

    MS41918M是瑞盟科技推出的一款用于网络摄像机和监控摄像机的镜头驱动片。芯片内置光圈控制功能;通过电压驱动方式以及扭矩纹波修正技术,实现了超低噪声微步驱动。主要特点:■电压驱动方式,256 微步
    发表于 10-21 11:32

    基于摄像机的运动员姿态计算

    运动员姿态的计算是非常困难的并且有很多应用。在本文中,我们主要针对运动员身体倾角,提出了一种基于摄像机的几何计算方法。首先,利用针孔模型对场景进行3d 重建
    发表于 08-12 08:41 9次下载

    CCD 摄像机质量对网络摄像机的影响

    CCD 摄像机质量对网络摄像机的影响提要:网络摄象机 ( 网络摄象服务器、视频服务器、网络视频转换器等 ) 采用的 CCD 摄像机的质量对带宽的影响很大,采用优质
    发表于 12-29 11:23 749次阅读

    网络摄像机

    网络摄像机   网络摄像机是一种结合传统摄像机与网络技术所产生的新一代摄像机,它
    发表于 01-07 10:17 871次阅读

    基于摄像机的电力设施侵入目标参数计算

    基于摄像机成像的电力设施侵入目标的参数计算,首先采用成本较低的摄像机目视觉系统,对摄像机
    发表于 07-16 16:57 33次下载

    基于OpenCV摄像机标定

    本文CameraCalibrator类源代码来自于OpenCV2 计算机视觉编程手册(Robert Laganiere 著 张静 译) 强烈建议阅读机器视觉学习笔记(4)——摄像机
    发表于 02-08 03:36 811次阅读

    基于OpenCV的双目摄像机标定

    )——摄像机标定参数说明  机器视觉学习笔记(5)——基于OpenCV
    发表于 02-08 03:41 735次阅读

    opencv相机标定例程

    可选参数进行摄像机标定的程序。calibration_artificial.cpp 是程序模拟模拟摄像机标定的过程,即程序创建棋盘然后自主标定。
    发表于 12-04 17:23 3638次阅读
    <b class='flag-5'>opencv</b><b class='flag-5'>单</b><b class='flag-5'>目</b>相机标定例程

    网络摄像机和模拟摄像机_数字摄像机的区别分析

    数字摄像机包括目前市场上主流的有三种产品:网络摄像机,SDI摄像机,网线通摄像机。网络高清摄像机主要由视频采集、视频编码、网络传输等几部分组
    发表于 01-02 15:39 9825次阅读

    RFID技术融入摄像机 实现智能视频监控

    和视频分析技术的应用,从而实现智能视频监控。因此融入RFID技术的摄像机应运而生,为摄像机插上感知的翅膀,使摄像机耳聪明。
    发表于 11-25 10:42 3947次阅读

    摄像机和高清网络摄像机的差别是什么,都具有什么特点

    现在,我们在看视频的时候,都有标清、高清、超高清之分,摄像机也不例外。在目前这个对于清晰度要求越来越高的时代下,市场上的网络摄像机的种类也越来越多,以清晰度划分,就有标清、高清、全高清之分。那么标清
    的头像 发表于 11-04 16:40 4896次阅读