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 . 将要进行的工作

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

审核编辑:汤梓红

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

    关注

    206

    文章

    27043

    浏览量

    201418
  • 摄像头
    +关注

    关注

    59

    文章

    4609

    浏览量

    92901
  • 相机
    +关注

    关注

    4

    文章

    1253

    浏览量

    52453
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40786
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83467

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

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

收藏 人收藏

    评论

    相关推荐

    CCD摄像机选购技巧

    来保证视频信号的同步,它可保证不同的设备输出的视频信号具有相同的帧、行的起止时间。为了实现外同步,需要给摄像机输入一个复合同步信号(C-sync)或复合视频信号。外同步并不能保证用户从指定时刻得到完整
    发表于 06-16 15:10

    彩色摄像机功能分析与应用

    CCD彩色摄像机的可调整功能 :(1)同步方式的选择A、对台彩色摄像机而言,主要的同步方式有下列三种:内同步——利用彩色摄像机内部的晶体振荡电路产生同步信号来完成操作。外同步——利用
    发表于 08-18 15:42

    红外摄像机技术原理图解

    特殊的热红外夜视仪可以实现夜间监控。但这种特殊的热红外夜视仪造价昂贵,而且不能直观、清晰地反映周围环境状况,因此在通常的夜视系统中较少被采用。 主动红外摄像机技术,即利用红外灯来产生红外辐射,发出
    发表于 08-26 10:21

    监控摄像机的同步方式选择法

         对台监控摄像机而言,主要的同步方式有下列三种: 内同步--利用监控摄像机内部的晶体振荡电路产生同步信号来完成操作
    发表于 10-06 16:44

    网络摄像机是什么意思

    网络摄像机 是一种结合传统摄像机与网络技术所产生的新一代摄像机,它可以将影像通过网络传至有网络连接端口的另一端,且远端的浏览者不需用任何专业软件,只要标准的网络浏览器(如“Microsoft IE或
    发表于 12-29 14:11

    深入了解红外摄像机

    发出的红外光较强,其它物体发出的红外光很微弱,利用特殊的红外摄像机可以实现夜间监控。但这种特殊的红外摄像机造价昂贵,而且不能反映周围环境状况,因此在夜视系统中不被采用。    主动红外摄像
    发表于 02-05 15:46

    网络摄像机是什么?

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

    [原创]浅谈监控摄像机的技术原理与应用

    摘要:主要介绍低照度监控摄像机的技术原理、应用等,对比低照度监控摄像机与红外摄像机的异同。当今,大众对监控产品要求越来越高,不仅要实现全天候24小时监控,还要在照明条件不足的情况下呈现
    发表于 06-30 11:12

    摄像机同步方式

    ,是利用摄像机的交流电源来完成垂直推动同步,即摄像机和电源零线同步。  车载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

    LabVIEW+Python+openCV

    的,动态链接库也需要配置,还需要知道各个参数含义和类型,这里提供另外一种方法,那就是PythonopenCV工具包,绝对开源和免费,LabVIEW可以利用Python节点调用Python
    发表于 12-07 20:59

    基于OpenCV的单目摄像机标定

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

    基于OpenCV的双目摄像机标定

    (4)——单目摄像机标定参数说明  机器视觉学习笔记(5)——基于OpenCV的单目摄像机标定  机器视觉学习笔记(6)——双目摄像机标定参数说明 1.双目
    发表于 02-08 03:41 612次阅读