位置: IT常识 - 正文

单目测距原理与实现(代码可运行)(单目测距精度)

编辑:rootadmin
单目测距原理与实现(代码可运行)

推荐整理分享单目测距原理与实现(代码可运行)(单目测距精度),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:单目图像测距,单目测距精度,单目测距精度,单目测距精度,单目测距和双目测距,单目测距原理与实现,单目测距原理与实现,单目测距方法,内容如对您有帮助,希望把文章链接给更多的朋友!

 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 cv2import numpy as npwin_width = 1920win_height = 1200mid_width = int(win_width / 2)mid_height = int(win_height / 2)foc = 2810.0real_wid = 11.69font = cv2.FONT_HERSHEY_SIMPLEXw_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: break gray = 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: # 对于矩形区域,只显示大于给定阈值的轮廓,所以一些微小的变化不会显示。对于光照不变和噪声低的摄像头可不设定轮廓最小尺寸的阈值 continue x, y, w, h = cv2.boundingRect(c) # 该函数计算矩形的边界框 if x > mid_width or y > mid_height: continue if (x + w) < mid_width or (y + h) < mid_height: continue if h > w: continue if x == 0 or y == 0: continue if x == win_width or y == win_height: continue w_ok = w cv2.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()程序效果图如下:

本文链接地址:https://www.jiuchutong.com/zhishi/299575.html 转载请保留说明!

上一篇:使用YOLOv5实现图片、视频的目标检测(yolov5的使用)

下一篇:JSONP数据劫持漏洞(json解析漏洞)

  • 动产租赁税率是多少2023
  • 房产税计入管理费用了,汇算清缴怎么调
  • 白酒赠品赠什么方案
  • 租赁费税率3%
  • 定期定额的个税起征点
  • 社保怎样新增人员
  • 哪些纳税人需要实名办税
  • 工会经费为员工计税依据是什么
  • 电梯生产设备
  • 长期股权投资转入持有待售资产
  • 实发工资比计提多汇算清缴要怎么处理
  • 增值税过期未抵扣
  • 税收滞纳金算不算营业利润
  • 税务稽查执法要以什么为依据,按照法定的职责
  • 涉税事先裁定
  • 增值税发票总金额是含税金额吗
  • 如何理解增值税的三种类型?它们的区别是什么?
  • 债务重组收益会计处理
  • 如何设置自动登录账号
  • 关于商品退换
  • 分期购车的会计分录
  • 销售门窗并安装如何缴纳增值税
  • 税控服务费政策
  • 增值税加计抵减最新政策2022
  • 长期贷款利息怎样计算
  • win10怎么样禁止电脑运行某个程序
  • 无法访问windows installer服务,没有正确安装
  • 采购合同付款违约条款怎么签
  • 应交增值税的处理
  • 公司购买写字楼怎么入账
  • php字符串赋值
  • 代理业务资产的意思
  • 给客户回扣如何做账
  • 富贵竹怎么养才能更旺盛水培生根
  • 塞巴斯蒂安电影 豆瓣
  • 如何用php制作表格
  • 营改增之前的建筑业税率是多少
  • uniapp和vue哪个好
  • calc下载
  • 香港企业的所得税怎么算
  • 年报超时了可以补报吗
  • phpcms文档
  • mysql的一些命令
  • 年总资产平均余额是什么
  • 将房产以股权形式出售
  • 利润表反映了什么能力
  • 小微企业0税务报税流程
  • sqlserver 进程死锁
  • 保理公司会计核算讲解
  • 工程分包如何开具发票
  • 预收账款所得税汇算清缴需要调吗
  • 没开发票能确认没开发票能确认收入申报纳税吗?
  • 商家代金券谁出钱
  • 委托方和受委托方的法律关系
  • 抵扣认证的发票需要还回去吗
  • 总公司是否可以注销分公司
  • mysql中一个普通ERROR 1135 (HY000)错误引发的血案
  • mysql联合索引生效原则
  • sqlbean
  • win8官方安装教程
  • win2003和2003r2
  • ubuntu设置默认编辑器
  • win7安装程序遇到错误0xc0000135
  • win10无法收到wifi
  • win7重装系统需要重新激活吗
  • ie10变成ie8
  • 电脑qq语音界面
  • perl $?
  • Node.js中的事件循环是什么
  • 安卓用什么抓包
  • javascript学习指南
  • java learning
  • jqgrid tree
  • JQuery绑定事件的函数是
  • 老司机指的是
  • 杭州汽车摇号中签率多少
  • 领的增值税发票怎么读入?
  • 中华人民共和国道路交通安全法
  • 税收分类编码1080499
  • 工商注册app是不是在手机上可以完全操作
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设