Opencv3实现单目视觉测距

一、前言

单目视觉测距:网上有很多关于单目测距的文章,主要借鉴的是OpenCV学习笔记(二十一)——简单的单目视觉测距尝试和单目摄像机测距(python+opencv)两篇文章,在这里特别作出说明。

工作环境:Ubuntu16.04 + Opencv3.4.0 +Pycharm

单目相机:DFK AFUX236-M12

二、单目测距原理

单目相机测距常用或者说实用的方法就是相似三角形法,为了让大家更好地理解程序,这里简单说一下相似三角形法。

相似三角形:假设我们有一个宽度为 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是摄像机焦距。

三、实现代码:

import cv2
import numpy as npwin_width = 1920
win_height = 1200
mid_width = int(win_width / 2)
mid_height = int(win_height / 2)foc = 2810.0
real_wid = 11.69
font = cv2.FONT_HERSHEY_SIMPLEX
w_ok = 1capture = cv2.VideoCapture(1)
capture.set(3, win_width)
capture.set(4, win_height)while(True):ret, frame = capture.read()# frame = cv2.flip(frame, 1)if ret == False:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray, (5, 5), 0)ret, binary = cv2.threshold(gray, 127, 255, 0)kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))binary = cv2.dilate(binary, kernel, iterations=2) # 形态学膨胀contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# cv2.drawContours(frame, contours, -1, (0, 255, 0), 2)for c in contours:if cv2.contourArea(c) < 2000: # 对于矩形区域,只显示大于给定阈值的轮廓,所以一些微小的变化不会显示。对于光照不变和噪声低的摄像头可不设定轮廓最小尺寸的阈值continuex, y, w, h = cv2.boundingRect(c) # 该函数计算矩形的边界框if x > mid_width or y > mid_height:continueif (x + w) < mid_width or (y + h) < mid_height:continueif h > w:continueif x == 0 or y == 0:continueif x == win_width or y == win_height:continuew_ok = wcv2.rectangle(frame, (x + 1, y + 1), (x + w_ok - 1, y + h - 1), (0, 255, 0), 2)dis_inch = (real_wid * foc) / (w_ok - 2)dis_cm = dis_inch * 2.54# os.system("cls")# print("Distance : ", dis_cm, "cm")frame = cv2.putText(frame, "%.2fcm" % (dis_cm), (5, 25), font, 0.8, (0, 255, 0), 2)frame = cv2.putText(frame, "+", (mid_width, mid_height), font, 1.0, (0, 255, 0), 2)cv2.namedWindow('res', 0)cv2.namedWindow('gray', 0)cv2.resizeWindow('res', win_width, win_height)cv2.resizeWindow('gray', win_width, win_height)cv2.imshow('res', frame)cv2.imshow('gray', binary)c = cv2.waitKey(40)if c ==27:breakcv2.destroyAllWindows()

程序效果图如下:

单目测距原理与实现(代码可运行)相关推荐

  1. 【自动驾驶】摄像头单目测距原理及实现

    原文链接:摄像头单目测距原理及实现 可以观看这个视频,了解针孔相机和透镜. 摄像头单目测距原理及实现 一.测距原理 空间的深度或距离等数据的摄像头. 人的眼睛长在头部的前方,两只眼的视野范围重叠,两眼 ...

  2. python测量镜头到目标距离_摄像头单目测距原理及实现

    摄像头单目测距原理及实现 一.测距原理 空间的深度或距离等数据的摄像头. 人的眼睛长在头部的前方,两只眼的视野范围重叠,两眼同时看某一物体时,产生的视觉称为双眼视觉. 双眼视觉的优点是可以弥补单眼视野 ...

  3. 单目测距原理及代码实现

    转载:https://www.cnblogs.com/wujianming-110117/p/12822331.html

  4. yolo 车辆测距+车辆识别+单目测距(双目测距)

    基于yolo目标检测算法实现的车前道路中的车辆和行人检测,并且可以估测出目标与本车之间的距离 一.视频展示 yolo车距1 订阅专栏获得源码(提供完整代码,无需看下文) 二.单目测距原理 图中有一个车 ...

  5. 相机模型、相机标定及基于yolov5的单目测距实现

    相机模型.相机标定及基于yolov5的单目测距实现 1 前言 2 相机模型及单目测距原理 3 相机参数标定 3.1 内参矩阵 3.2 内参标定 3.3 外参矩阵 4 基于yolov5的单目测距实现 1 ...

  6. python opencv单目测距 小孔成像原理

    python opencv单目测距 小孔成像原理 小孔成像原理 代码 opencv>3.x 小孔成像原理 一 用相似三角形计算物体或者目标到相机的距离 我们将使用相似三角形来计算相机到一个已知的 ...

  7. python手机摄像头投测距_python opencv单目测距 小孔成像原理

    python opencv单目测距 小孔成像原理 小孔成像原理 一 用相似三角形计算物体或者目标到相机的距离 我们将使用相似三角形来计算相机到一个已知的物体或者目标的距离. 相似三角形就是这么一回事: ...

  8. 目标检测+目标追踪+单目测距(毕设+代码)

    更多视觉额自动驾驶项目请见: 小白学视觉 自动驾驶项目 项目成果图 现推出专栏项目:从图像处理(去雾/去雨)/目标检测/目标跟踪/单目测距/到人体姿态识别等视觉感知项目---------------- ...

  9. opencv手册_OpenCV之单目测距实现

    最近要做一个小项目,要完成相机的测距实现,最先考虑的是三角激光测距,但是实现起来太麻烦了,基本要搭一个简易的激光测距雷达...然后是双目测距,然而一个便宜的双目工业相机也要四五百,而且以前也没接触过双 ...

最新文章

  1. 编程之美2.13 子数组的最大乘积
  2. C# 关闭正在执行的文件
  3. Windows Azure Cloud Service (17) Role Endpoint
  4. RK 利用SARADC 来做多个按键
  5. 山东省计算机考试无法报名,山东省2017年9月全国计算机等级考试报名事项公告...
  6. 码云 GVP 项目 SequoiaDB 完成 C 轮数千万美元融资
  7. 性能比拼!超详细的Tengine GEMM矩阵乘法汇编教程
  8. P2475 [SCOI2008]斜堆(递归模拟)
  9. Eclipse自定义启动画面和状态栏图标以及各种小图标的含义
  10. Discuz支持反对提示:抱歉您的请求来路不正确或表单无法提交的解决方法
  11. mybatis原始mapper开发未集成springMVC
  12. MySQL 用gourp by分组后取某一字段最大值
  13. 修改Google桌面搜索索引位置
  14. Intel早期的CPU和现在MCU相比,表现如何?
  15. 【良心推荐】国内适合中小企业、团队的十大协同办公系统
  16. 81章 老子1章到_《老子》第一章新解
  17. jdk-17下载与安装(window10)
  18. 回文序列是指正读反读均相同的字符序列,如“abba”和“abdba”均是 回文,但“good”不是回文。试写一个算法判定给定的字符串是否为回文序列。
  19. MapX 简介 (转)
  20. php 时间间隔月数,PHP计算两个时间相差的年数、月数和天数程序

热门文章

  1. PHP环境安装到U盘,Windows To Go辅助工具一键把Win10系统安装到U盘 | 麦田一棵葱
  2. 一个好的产品如何定义?
  3. 项目原型设计(那周余嘉熊掌将得队)
  4. ElasticSearch启动报错future versions of Elasticsearch will require Java 11; your ---ElasticSearch工作笔记030
  5. Xcode下载地址 官网地址,无毒无害
  6. 豆瓣前250个电影的相关分析
  7. 百家讲坛-《人类的起源》 吴新智
  8. ssm博客系统-博主登陆功能实现(shiro支持)
  9. mysql8找不到bir_beetlsql.adoc
  10. gigaset812说明书_西门子+Gigaset+A280+说明书.pdf