点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达本文转自|新机器视觉

我的论文方向目前是使用单目摄像头实现机器人对人的跟随,首先单目摄像头与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是摄像机焦距。

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

程序效果图如下:

在这张图里我摄像头距离桌面大概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)

存在的问题:

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

Traceback (most recent call last):
  File "video_paper_distance.py", line 86, in <module>
    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进行行人检测:

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

3.存在的问题:

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

4 . 将要进行的工作

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

 End 

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

基于OpenCV的单目摄像机测距相关推荐

  1. 基于OpenCV的单目相机标定与三维定位

    相机是产生图像数据的硬件,广泛应用于消费电子.汽车.安防等领域.围绕着相机衍生出一系列的研究与应用领域,包括传统的图像处理和基于深度学习的智能应用等.目前大火的自动驾驶中相机也是重要的硬件组成,如环视 ...

  2. opencv 图像上画出目标运动的轨迹_基于opencv的单目和双目标定平台手眼标定

      背景介绍 基于机器视觉引导的智能机器人,在现代社会各个领域已经得到了广泛的应用,尤其是大型工厂的自动化生产线上,视觉机器人可以和基于示教器按照预定轨迹进行作业的机器人互为补充,来共同提高生产的自动 ...

  3. opencv 通过网络连接工业相机_单目摄像机测距(python+opencv)

    点击上方"新机器视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 我的论文方向目前是使用单目摄像头实现机器人对人的跟随,首先单目摄像 ...

  4. 单目摄像机测距(python+opencv)(转载)

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

  5. 基于OPENCV的单目测距

    最近研究了一下单目测距,关于单目测距的原理有各位大神的讲解,这里只写一些自已使用上的记录,使用环境为windows10+opencv3.1+vs2015. 买了一个摄像头(笔记本的定焦摄像头也可以), ...

  6. 单目摄像机测距(python+opencv)

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

  7. 机器视觉学习笔记(4)——单目摄像机标定参数说明

    机器视觉学习笔记(4)--单目摄像机标定参数说明 标签: 机器视觉 1.针孔摄像机模型 在介绍摄像机标定参数之前,需要先简单说一下针孔摄像机的原理.投影平面到小孔的距离为焦距f,物体到小孔的距离为Z, ...

  8. 前车碰撞预警——FCW,基于深度学习和单目摄像头测距的前车碰撞预警源码

    前车碰撞预警--FCW,基于深度学习和单目摄像头测距的前车碰撞预警源码. 单目测距,多目标跟踪. 车辆检测,智能adas,FCW,价格只包括源码及设计文档讲解. 我使用的版本说明: gpu版本: an ...

  9. 基于深度学习和单目摄像头测距的前车碰撞预警源码

    前车碰撞预警--FCW,基于深度学习和单目摄像头测距的前车碰撞预警源码 单目测距,多目标跟踪. 车辆检测,智能adas,FCW,编号只包括源码及设计文档讲解. 我使用的版本说明: gpu版本: ano ...

最新文章

  1. IBM大裁70% 员工,撕掉了国内大批伪AI企业最后一块遮羞布!
  2. 一篇文章搞懂fof好友推荐案例
  3. CPython对象模型:string(留坑待填)
  4. 北航研究生计算机系论文手册,计算机学院-北航研究生院-北京航空航天大学.doc...
  5. 获取Android手机的分辨率通过ADB命令
  6. POJ 1944 Fiber Communications (枚举 + 并查集 OR 线段树)
  7. js防篡改对象之不可扩展对象
  8. 计算高斯混合模型的可分性和重叠度(Overlap Rate, OLR)
  9. HDU 2577(DP)
  10. 英语语音中的调核例子_英语歌曲在英语教学中扮演的重要角色
  11. scp 免输入密码的方法
  12. 全球IPv4地址正式耗尽!
  13. C程序之修改Windows的控制台颜色(转载)
  14. HackerRank [Algo] Matrix Rotation
  15. Python爬虫技术系列-02HTML解析-BS4
  16. int类型转成Long类型
  17. 推荐给互联网人的5个赛道
  18. docker修改command_docker保存对容器的修改
  19. 破三立五,拥抱数字化,不依赖巨头 ,做企业自己的主人
  20. CSS背景:背景色/背景图像/背景重复/背景附着/简写背景属性(一文搞懂)

热门文章

  1. 智能音箱玩出新花样?这家公司推出2699元的智能虚拟机器人
  2. 百度智能云一口气发布 14 个新产品,三大视频解决方案,产品最高降价 50%
  3. NLP实践:对话系统技术原理和应用
  4. Logback 配置文件这样优化,TPS提高 10 倍
  5. 图解 i++ 和 ++i 的区别,看完不懂你顺着网线来揍我!
  6. 挺带劲,这款国人开源的监控系统功能真强大~
  7. 科普|什么是负载均衡(Load balancing)
  8. 2021 OceanBase 数据库大赛来了!
  9. 重磅!《深度学习 500 问》已更新,GitHub 标星 2.6W(附完整下载)
  10. 【干货】NLP中对困惑度感到困惑?