位置: 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解析漏洞)

  • 天猫精灵怎么连接灯(天猫精灵怎么连接网络)

    天猫精灵怎么连接灯(天猫精灵怎么连接网络)

  • 魅族17是什么类型的扬声器(魅族17是旗舰机吗)

    魅族17是什么类型的扬声器(魅族17是旗舰机吗)

  • 华为nova5i卡槽在哪(华为nova5p卡槽)

    华为nova5i卡槽在哪(华为nova5p卡槽)

  • 苹果11pormax支持5g吗(苹果11pormax支持20w快充吗)

    苹果11pormax支持5g吗(苹果11pormax支持20w快充吗)

  • 怎么才能集齐抖音卡(抖音2021怎么集)

    怎么才能集齐抖音卡(抖音2021怎么集)

  • 华为p40支持nfc功能吗(华为p40可以nfc)

    华为p40支持nfc功能吗(华为p40可以nfc)

  • 微信全员禁言怎么开(微信全员禁言怎样解除)

    微信全员禁言怎么开(微信全员禁言怎样解除)

  • oppo手机速览怎么关闭(oppo手机速览怎么恢复)

    oppo手机速览怎么关闭(oppo手机速览怎么恢复)

  • 红米k30pro支持面部识别吗(红米k30pro支持面容支付吗)

    红米k30pro支持面部识别吗(红米k30pro支持面容支付吗)

  • vivo插耳机没声音(vivo手机插耳机没声音)

    vivo插耳机没声音(vivo手机插耳机没声音)

  • 苹果拍照怎么显示水印(苹果拍照怎么显示经纬度地点和时间)

    苹果拍照怎么显示水印(苹果拍照怎么显示经纬度地点和时间)

  • 申诉不成功如何找回QQ密码(申诉不成功如何找回微信密码)

    申诉不成功如何找回QQ密码(申诉不成功如何找回微信密码)

  • jat一al00是什么型号手机(jat-al00什么型号多少钱)

    jat一al00是什么型号手机(jat-al00什么型号多少钱)

  • int型数据的取值范围怎么算(int型数据的取值范围,0-65535)

    int型数据的取值范围怎么算(int型数据的取值范围,0-65535)

  • 半开麦和全开麦是什么意思(半开麦和全开麦哪个好听)

    半开麦和全开麦是什么意思(半开麦和全开麦哪个好听)

  • 微信视频一小时多少流量(微信视频一小时大概消耗多少流量)

    微信视频一小时多少流量(微信视频一小时大概消耗多少流量)

  • qq注销后头像显示什么(qq用户注销后的头像)

    qq注销后头像显示什么(qq用户注销后的头像)

  • 苹果手机下载软件灰色点不动怎么回事(苹果手机下载软件需要钱吗)

    苹果手机下载软件灰色点不动怎么回事(苹果手机下载软件需要钱吗)

  • 手机电池不存电怎么办(手机电池不存电了还能用吗)

    手机电池不存电怎么办(手机电池不存电了还能用吗)

  • 恋爱记怎么解除关系(恋爱记怎么解除另一半)

    恋爱记怎么解除关系(恋爱记怎么解除另一半)

  • pcb是什么意思(高频pcb是什么意思)

    pcb是什么意思(高频pcb是什么意思)

  • 硬盘属于什么存储器(硬盘属于什么存储设备)

    硬盘属于什么存储器(硬盘属于什么存储设备)

  • 萤石如何强制解绑(萤石如何强制解绑视频)

    萤石如何强制解绑(萤石如何强制解绑视频)

  • 移动宽带怎么设置无线路由器(移动宽带怎么设置定时断网)

    移动宽带怎么设置无线路由器(移动宽带怎么设置定时断网)

  • 收购分公司和谁签协议
  • 外贸企业申报退税流程
  • 资产负债表债务法是什么意思
  • 销售农产品是否可以抵税
  • 非营利组织管理规定
  • 外资企业对应的企业是什么
  • 哪些固定资产不需要计提折旧
  • 待处理产品损益账户的核算内容不包括
  • 购置一台设备初始费用为60000元,该设备可使用7年,答案
  • 公司外籍人员签证如何办理
  • 月初发票认证能抵扣吗
  • 工业企业小规模纳税人的认定标准
  • 已抵扣发票红冲后发票还给对方公司
  • 办公设备的税收编码
  • 质押股票是否缴印花税
  • 开专票需要哪些东西
  • 境内企业向香港股东分红税率是多少
  • 电子普票开具的最新文件
  • 什么经营范围可以开培训费
  • 报表上应交税费是负数是什么意思
  • 鸿蒙工具箱巅峰模式有什么用
  • u盘的重装系统
  • 如何做会计分录
  • 职工福利费的计提标准
  • 更改文件后缀算转换格式吗
  • opera software
  • 电风扇需要用完电再充吗
  • Yii2使用swiftmailer发送邮件的方法
  • 现金清查的会计分录
  • php判断是否连接数据库
  • css实现文字颜色渐变
  • 【简陋Web应用2】人脸检测——基于Flask和PaddleHub
  • 新手学web前端开发
  • ssh-keygen命令
  • 公司变卖汽车按什么税率
  • python的socket
  • mysql基本命令大全
  • 健身房注册公司能注册医疗吗?
  • 核定征收企业所得税应税所得率
  • 当月收入可以下月开票吗
  • mysql怎么实现原子性
  • 未开票收入本月要计提增值税吗
  • 代开运输发票会不会造成重复征税?
  • 辅导费入什么科目
  • 固定资产工作汇报
  • 车辆购置税如何账务处理
  • 电子商务中流量的定义
  • 垃圾清运费会计处理
  • 鉴证咨询服务费可以抵扣吗
  • 消耗性生物资产属于非流动资产吗
  • 增发股票会计科目
  • 培训费用支出
  • 空头支票是什么数字
  • 如何查企业是否有问题
  • 明细账怎么弄
  • mysql怎么复制粘贴语句
  • sqlserver响应好慢
  • windows自带安全
  • win7 计划任务服务启动失败
  • win10无法安装软件怎么解决
  • ubuntu网页打开很慢
  • centos7.9关机
  • console打开
  • window 查看端口
  • win7旗舰版显示不全屏
  • msscli.exe - msscli是什么进程 有什么用
  • win8开始界面如何设置成win7
  • win7系统电脑打开的软件闪退怎么办
  • windows8如何使用
  • linux spid
  • dos怎么上网
  • 需要牢记的号码
  • radio js取值
  • unity linux arm
  • js面向对象写法
  • c# addin
  • 安徽省工商总局
  • 安徽省国家税务局网上办税平台
  • 虚假纳税申报的法律责任
  • 税务局的人为什么那么拽
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设