单目摄像头测量距离:相似三角形法

  • 用相似三角形法目标到相机的距离
    • 计算相机焦距
  • 代码实现
  • 总结

已知一点经纬度和距离,计算另一点的经纬度,详见: https://blog.csdn.net/qq_41694461/article/details/123130094.

用相似三角形法目标到相机的距离

计算相机焦距

目前摄像机大多数都是自动对焦的,所以我们第一步就要求出相机焦距,公式如下:
f = (w*L)/W
f = (h*L)/H

f:镜头焦距
w:图象的宽度(被摄物体在ccd靶面上成象宽度即目标的像素宽度)
W:被摄物体宽度
L:被摄物体至镜头的距离
h:图象高度(被摄物体在ccd靶面上成像高度)视场(摄取场景)高度
H:被摄物体的高度

ccd靶面规格尺寸 单位mm
规格 W    H
1/3" 4.8    3.6
1/2" 6.4    4.8
2/3" 8.8    6.6
1" 12.7    9.6

摄像机画面宽度和高度与监视器接收机画面宽度和高度一样,其比例均为4:3,当L不变,H或W增大时,f变小,当H或W不变,L增大时,f增大。
eg:假设我在离相机距离 D = 24 英寸的地方放一张标准的 8.5 x 11 英寸的 A4 纸(横着放;W = 11)并且拍下一张照片。我测量出照片中 A4 纸的像素宽度为 P = 249 像素。
因此我的焦距 F 是:

F = (248px x 24in) / 11in = 543.45

假设我将相机移到距离目标 3 英尺(或者说 36 英寸)的地方并且拍下上述的 A4 纸。通过自动的图形处理我可以获得图片中 A4 纸的像素距离为 170 像素。将这个代入公式得:
像素距离:即目标在图像中的宽度/高度
D’ = (11in x 543.45) / 170 = 35 英寸

我们可以看到,要想得到距离,我们就要知道摄像头的焦距和目标物体的尺寸大小,这两个已知条件根据公式:  
D’ = (W x F) / P

代码实现

PYthon代码实现:

# import the necessary packages
import numpy as np
import cv2# 找到目标函数
def find_marker(image):# convert the image to grayscale, blur it, and detect edgesgray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray, (5, 5), 0)edged = cv2.Canny(gray, 35, 125)# find the contours in the edged image and keep the largest one;# we'll assume that this is our piece of paper in the image(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)# 求最大面积c = max(cnts, key=cv2.contourArea)# compute the bounding box of the of the paper region and return it# cv2.minAreaRect() c代表点集,返回rect[0]是最小外接矩形中心点坐标,# rect[1][0]是width,rect[1][1]是height,rect[2]是角度return cv2.minAreaRect(c)# 距离计算函数
def distance_to_camera(knownWidth, focalLength, perWidth):# compute and return the distance from the maker to the camerareturn (knownWidth * focalLength) / perWidth# initialize the known distance from the camera to the object, which
# in this case is 24 inches
KNOWN_DISTANCE = 18.11# initialize the known object width, which in this case, the piece of
# paper is 11 inches wide
# A4纸的长和宽(单位:inches)
KNOWN_WIDTH = 11.69
KNOWN_HEIGHT = 8.27# initialize the list of images that we'll be using
IMAGE_PATHS = ["img.png", "img_1.png", "Picture3.jpg"]# load the furst image that contains an object that is KNOWN TO BE 2 feet
# from our camera, then find the paper marker in the image, and initialize
# the focal length
# 读入第一张图,通过已知距离计算相机焦距
image = cv2.imread(IMAGE_PATHS[0])
print(image.shape)
marker = find_marker(image)
print(marker[1][0])
focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH# 通过摄像头标定获取的像素焦距
# focalLength = 811.82
print('focalLength = ', focalLength)# 打开摄像头
camera = cv2.VideoCapture(0)while camera.isOpened():# get a frame(grabbed, frame) = camera.read()marker = find_marker(frame)if marker == 0:print(marker)continue# focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTHinches = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0])print("a4值得宽",KNOWN_WIDTH, focalLength, marker[1][0], inches)# draw a bounding box around the image and display it# box = np.int0(cv2.cv.BoxPoints(marker))box = cv2.boxPoints(marker)box = np.int0(box)cv2.drawContours(frame, [box], -1, (0, 255, 0), 2)# inches 转换为 cmcv2.putText(frame, "%.2fcm" % (inches * 30.48 / 12),(frame.shape[1] - 200, frame.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX,2.0, (0, 255, 0), 3)# show a framecv2.imshow("capture", frame)if cv2.waitKey(1) & 0xFF == ord('q'):break
camera.release()
cv2.destroyAllWindows()

效果图:

![在这里插入图片描述](https://img-blog.csdnimg.cn/a1f98441737942a985ed3f6d16b5c29e.png

总结

1 我们首先要计算出焦距大小
2 要知道我们求得目标的宽度(对于目标在像素中重叠,或者遮挡,这个方法应该不可以用)

【单目摄像头测量距离:相似三角形法】相关推荐

  1. 3D视觉(二):单目摄像头的标定与校正

    3D视觉(二):单目摄像头的标定与校正 文章目录 3D视觉(二):单目摄像头的标定与校正 一.相机模型 1.机器车坐标系到相机坐标系 2.相机坐标系到归一化平面坐标系 3.归一化平面坐标畸变 4.归一 ...

  2. 单目摄像头标定与测距

    单目摄像头标定与测距 一. 标定 首先要对摄像头做标定,具体的公式推导在learning opencv中有详细的解释,这里顺带提一句,这本书虽然确实老,但有些理论.算法类的东西里面还是讲的很不错的,必 ...

  3. OpenCV实现单目摄像头对图像目标测距

    使用opencv对单目摄像头中的目标实现测量距离(python实现) 1.方法介绍: 根据相似三角形的方法: F = P×D / W , 其中W为物体的实际宽度,D为物体平面与相机平面的距离,照片上物 ...

  4. 单目摄像头检测6D姿态

    单目摄像头检测6D姿态 CVPR2019: ROI-10D: Monocular Lifting of 2D Detection to 6D Pose and Metric Shape 论文链接: h ...

  5. 基于单目摄像头的BEV实例预测(ICCV 2021)

    作者丨黄浴@知乎 来源丨https://zhuanlan.zhihu.com/p/422992592 编辑丨3D视觉工坊 ICCV'21论文 "FIERY: Future Instance ...

  6. python怎么让摄像头图像暂停然后在启动_双目摄像头测量距离

    前言 在计算机视觉中,可以通过双目摄像头实现,常用的有BM 算法和SGBM 算法等,双目测距跟激光不同,双目测距不需要激光光源,是人眼安全的,只需要摄像头,成本非常底,也用于应用到大多数的项目中.本章 ...

  7. 【机器人原理与实践(二)】单目摄像头标定与单目测距

    文章目录 摄像头标定 4.1 单目相机的建模 4.1.1 图像坐标系到像素坐标系的转换 4.1.2相机坐标系到图像坐标系的转换 4.1.3 合并矩阵 4.2 固定向下摄像头标定 4.3 俯视摄像头标定 ...

  8. 基于matlab的摄像头,基于Matlab的单目摄像头标定

    实验环境:matlab2016 准备材料:单目摄像头.定标板.摄像头拍下定标板的图片 本博客带大家实际动手,再讲单目摄像头标定原理. 准备标定板 标定的开始阶段最需要用到的标定板,可以直接从openc ...

  9. 用普通摄像头测量距离

    近年来,由于无人机.无人车等技术的不断成熟,需要用到实时测距的场所也越来越多,如定位,避障,测速等,相比于其他测距方法,单目测距是利用一个摄像头进行视频拍摄,在图像中找到待测物体.这一系列动作,涉及到 ...

最新文章

  1. 还在 for 循环里使用 + 拼接字符串?明天不用来上班了!
  2. 【ES6】Generator函数详解
  3. pyspark读取hdfs 二进制文件
  4. 让逻辑关系破缺的最小空间尺寸
  5. 坑爹!花费2亿耗时2年,网站没建完Java都写不好,顶级咨询公司埃森哲被告上法庭
  6. linux下设置oracle开机自启动
  7. Spring核心技术原理-(2)-通过Web开发演进过程了解一下为什么要有Spring AOP?
  8. oracle添加序列器,Oracle 建表,添加主外键,序列,触发器
  9. Oracle Database 中 B*Tree 索引内部维护
  10. LeetCode 93. Restore IP Addresses
  11. 尚硅谷nginx学习笔记
  12. bp神经网络数据预测实例,bp神经网络预测数据
  13. Flash player 10(FLEX 4)的安全沙箱机制
  14. 如何使用南方CASS绘制地形图
  15. 使用GoLang开发游戏服务器(一)
  16. 怎么用阿里云服务器部署项目?上传简单项目
  17. 1人民币试用世纪互联azure虚拟机,跑CNN训练
  18. 超级好的6款办公软件,你用过几款呢?
  19. Mac Webpack Vue项目的搭建
  20. H3C服务器BIOS界面,全新改版图形化界面

热门文章

  1. 数字逻辑电路仿真电路:与非门组成的三人表决器
  2. 大商创小程序前端_正版授权风暴!大商创商城系统开启免费送授权活动
  3. servlet修改用户头像_Java上传文件实现更换头像
  4. axelor java快速开发平台和erp系统介绍
  5. 【UVA】【11021】麻球繁衍
  6. 京津冀计算机学科大学排名,2021京津冀地区民办大学排名前十
  7. 注意力缺陷/多动障碍和睡眠障碍之间有什么联系?基于大规模队列多模态研究
  8. pandas 玩转 Excel 操作总结
  9. C# 把时间转为秒_Python基础学习笔记(六)日期与时间
  10. 传《斗战神》美术创作婉拒暴雪挖角 中国游戏人缺少这份傲骨