基于OpenCV的摄像头测距

前言

去年暑假参加了一个比赛,比赛内容中需要确定目标的位置 本来想全用图像完成的,最后发现不是很符合要求。比完赛之后,就忙别的事了。直到现在突然想试试摄像头测距。就来了

一、测距原理

摄像头单目测距原理及实现

空间的深度或距离等数据的摄像头。

人的眼睛长在头部的前方,两只眼的视野范围重叠,两眼同时看某一物体时,产生的视觉称为双眼视觉。

双眼视觉的优点是可以弥补单眼视野中的盲区缺损,扩大视野,并产生立体视觉。


f为摄像头的焦距,c为镜头光心

模型的主要依据公式为f/d=h/H,设物体所在平面与相机平面的距离为d,物体实际高度为H,在传感器上的高度为h
根据这个模型,我们就能求出目标物体与我们的摄像头平面的距离。

分两种情况,但是这两种情况的条件都是假设实际物体与摄像机所在平面平行。

一种是当物体主线段过光心的情况,这种情况是最容易计算的, 即 h=sqrt ((横坐标之差*Dx)2+(纵坐标之差*Dy)2), Dx为每个像素的宽度,Dy为每个像素的高度,

二、代码

1.引入库

代码如下(示例):

import cv2
from cvzone.HandTrackingModule import HandDetector
import math
import numpy as np
import cvzone

2.读入数据

调用电脑摄像头,或者外接别的摄像头也可以
调用 cvzone 自带的手部检测器

cap = cv2.VideoCapture(0)
cap.set(3, 1280)
cap.set(4, 720)
detector = HandDetector(detectionCon=0.8, maxHands=1)

编写函数,转化为距离循环打印显示

while True:success, img = cap.read()hands = detector.findHands(img, draw=False)if hands:lmList = hands[0]['lmList']x, y, w, h = hands[0]['bbox']x1, y1 = lmList[5]x2, y2 = lmList[17]distance = int(math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2))A, B, C = coffdistanceCM = A * distance ** 2 + B * distance + Cprint(distanceCM, distance)cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 3)cvzone.putTextRect(img, f'{int(distanceCM)} cm', (x+5, y-10))cv2.imshow("Image", img)cv2.waitKey(1)

完整代码

import cv2
from cvzone.HandTrackingModule import HandDetector
import math
import numpy as np
import cvzonecap = cv2.VideoCapture(0)
cap.set(3, 1280)
cap.set(4, 720)# Hand Detector
detector = HandDetector(detectionCon=0.8, maxHands=1)# Find Function
# x is the raw distance y is the value in cm
x = [300, 245, 200, 170, 145, 130, 112, 103, 93, 87, 80, 75, 70, 67, 62, 59, 57]
y = [20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]
coff = np.polyfit(x, y, 2)  # y = Ax^2 + Bx + Cwhile True:success, img = cap.read()hands = detector.findHands(img, draw=False)if hands:lmList = hands[0]['lmList']x, y, w, h = hands[0]['bbox']x1, y1 = lmList[5]x2, y2 = lmList[17]distance = int(math.sqrt((y2 - y1) ** 2 + (x2 - x1) ** 2))A, B, C = coffdistanceCM = A * distance ** 2 + B * distance + Cprint(distanceCM, distance)cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 3)cvzone.putTextRect(img, f'{int(distanceCM)} cm', (x+5, y-10))cv2.imshow("Image", img)cv2.waitKey(1)

效果图:
在这里插入图片描述

总结

通过简单的几行代码,就可以实现视频测距。我是以手为检测目标测距,当然你也可以,调用别的分类检测器,搭配目标检测网络实现各种物体的检测 测距。(建议备一个,高清的摄像头。)
本项目的视频测距的 误差 大概在±2cm左右。

基于OpenCV的摄像头测距(2022-1-1)相关推荐

  1. 基于opencv在摄像头ubuntu根据视频获取

     基于opencv在摄像头ubuntu根据视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译执行步骤 安装编译opencv-2.3  參考h ...

  2. html5摄像头手势识别,基于OpenCV的摄像头动态手势轨迹识别及其应用

    [实例简介] 基于OpenCV的摄像头动态手势轨迹识别及其应用,前沿的研究,最新论文 2012 B_0% random t Xo X,XX 4_1.42.B0 Bhattacharyya glsl. ...

  3. 基于OpenCV的摄像头人脸检测

    一.选题背景 二.设计目的和意义 三.设计方案 四.特征分类器的选择 4.1 常用人脸检测的特征分类器 4.2 人脸的Haar特征分类器介绍 4.3 人脸的Haar特征分类器使用 五.设计中主要函数介 ...

  4. 软件c#语言调用摄像头,c#基于opencv,开发摄像头播放程序

    前言 Windows下实现摄像视频捕捉有多种实现方式:各种方式的优劣,本文不做对比.但是,opencv是一款老牌开发库,在图像处理领域声名显赫.采用opencv来处理摄像视频,在性能和稳定性上,是有保 ...

  5. 使用OpenCV实现摄像头测距

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自知乎z.defying https://zhuanlan. ...

  6. python打开摄像头获取图片_Python基于opencv调用摄像头获取个人图片的实现方法

    接触图像领域的应该对于opencv都不会感到陌生,这个应该算是功能十分强劲的一个算法库了,当然了,使用起来也是很方便的,之前使用Windows7的时候出现多该库难以安装成功的情况,现在这个问题就不存在 ...

  7. opencv获得图片的像素宽度_使用OpenCV实现摄像头测距

    原文链接: Find distance from camera to object using Python and OpenCV​www.pyimagesearch.com 摄像头测距就是计算照片中 ...

  8. 基于OpenCV的摄像头视频录制保存工具【附GIT源码地址】

    最近一个项目需要使用USB摄像头去采集视频并保存成文件,需要一个摄像头录制工具,要求其实很简单,就是能够将摄像头采集的图像加上一个时间戳的水印,实时保存到指定的文件中.同时为了防止文件过大,最好能够按 ...

  9. 学习OpenCV(4) 基于OpenCV的双目测距程序

    用MFC和OpenCV编写的双目测距程序,编写过程中参考了很多前人的经验,期间很多博主给我提供了源码或者问题解答,所以我想把我的经验写出来分享给大家,也许并没有什么使用价值,但是可以作为类似的项目的参 ...

最新文章

  1. jwt 私钥_一分钟带你了解JWT认证
  2. proto文件支持继承吗_搞懂 Javascript中this 指向及继承原理
  3. 遨博机器人执行线程_智造洞察 | 遨博机器人推出国内首条“用机器人生产机器人”产线;服务机器人等助力8月经济回升;浙江企业研发飞机发动机榫槽数控拉床...
  4. SAP Cloud for Customer的Calculated field字段
  5. 下一代CAN通信技术CAN XL简介
  6. 复旦大学计算机学院博士生王斌,复旦大学计算机科学技术学院博士生刘鹏飞荣获...
  7. android- Auto Monitor Logcat
  8. 苹果13英寸MacBook Pro有望下月更新 搭载M2芯片
  9. mysql修改binlog 位置_查看mysql 的binlog日志存放的位置(转)
  10. 微信小程序swiper滑块视图容器控件使用整理
  11. transition css3 渐变效果
  12. 严蔚敏数据结构c语言版第二版思维导图
  13. SQL Server 2008 R2永久激活秘钥
  14. Manjaro linux驱动HP1020 plus打印机折腾记
  15. x79主板不支持服务器内存条,x79主板支持什么内存
  16. MySQL - 大量 sending data 状态进程,让数据库性能急剧下降。
  17. WordPress按钮人机验证(1)
  18. RHCE之路https网站搭建,论坛搭建
  19. 论文 Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction
  20. RS232电平 RS485电平 RS422电平

热门文章

  1. Matlab实现 维特比译码
  2. 制作Windows10镜像的ISO
  3. Set排序的方式(常用三种,学会够用)
  4. 树莓派Odroid等卡片式电脑上搭建NAS教程系列5-Samba服务器安装
  5. power的数据库设计MySQL_使用 PowerDesigner 设计数据库 - ~~鱼跃~~ - 博客园
  6. ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr]
  7. SharePoint 2019 新功能展望
  8. Flink MySQL CDC 增量同步要求源表有主键
  9. APM/PX4将遥控器5通道之后的通道映射到舵机输出
  10. 标准C++ 实现TrimLeft TrimRight Trim