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

 更新时间:2022年08月01日 09:12:17   作者:奶茶不加冰  
这篇文章主要为大家详细介绍了OpenCV实现单目摄像头对图像目标测距,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

使用opencv对单目摄像头中的目标实现测量距离(python实现),供大家参考,具体内容如下

1.方法介绍:

根据相似三角形的方法:

F = P×D / W , 其中W为物体的实际宽度,D为物体平面与相机平面的距离,照片上物体的像素宽度为P,相机焦距为F
D = F×W / P ,这样知道相机的内参焦距就可以求得物体平面与相机平面的距离D

2.代码:

import cv2
import imutils
import numpy as np
from imutils import paths


# 获取目标的轮廓信息
def find_marker(image):

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 颜色空间转换函数,RGB和BGR颜色空间转换 opencv默认的颜色空间是BGR
    gray = cv2.GaussianBlur(gray, (5, 5), 0)  # 高斯滤波,对图像进行滤波操作 ,(5,5)表示高斯核的大小 ,0 表示标准差取0
    edged = cv2.Canny(gray, 35, 125)  # canny 算子 边缘检测 35是阈值1, 125是阈值2,大的阈值用于检测图像中的明显边缘,小的阈值用于将不明显的边缘检测连接起来

    cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)  # 找到详细的轮廓点, RETR_LIST 以列表的形式输出轮廓信息
    # CHAIN_APPROX_SIMPLE: 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标

    cnts = imutils.grab_contours(cnts)  # 寻找图像的轮廓信息,输入图像为一个二值图像

    c = max(cnts, key=cv2.contourArea)  # 轮廓点的面积计算
    # return edged
    return cv2.minAreaRect(c)  # 求出在 C点集下的像素点的面积


def get_F(W, D):

    P = find_marker(image)[1][0] / 118.11  # 300dim  1cm = 118.11像素值

    return (P*D) / W  # F = get_F(2, 126)  # 输出的值为cm f=24.003cm 焦距


def distance_to_camera(F, P, W):

    return (F*W) / P  # F 为相机的焦距,w为物体的宽度,P为物体在照片中的像素宽度,需要转换为cm


W = 2  # 需要手动测量目标的宽度,单位为cm
F = 24.00304  # 根据get_F求出 ,get_F()函数是为了求得相机的焦距,需要通过测试图像中的目标距离来求出

image = cv2.imread('065_5.jpg')
marker = find_marker(image)
P = marker[1][0] / 118.11  # 300dim 1cm = 118.11像素值 ,300dim指300分辨率,有1080分辨率,像素值的㎝转换是不同
inches = distance_to_camera(F, P, W) #
print('距离为:%.2f cm' % inches)  # 单位为cm

# draw a bounding box around the image and display it
box = cv2.cv.BoxPoints(marker) if imutils.is_cv2() else cv2.boxPoints(marker)
box = np.int0(box)
cv2.drawContours(image, [box], -1, (0, 255, 0), 2)
cv2.putText(image, "%.2fft" % inches,
            (image.shape[1] - 200, image.shape[0] - 20), cv2.FONT_HERSHEY_SIMPLEX,
            2.0, (0, 255, 0), 3)
cv2.imshow("image", image)

cv2.waitKey(0)
cv2.destroyAllWindows()

3.效果验证

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • Python生成随机数组的方法小结

    Python生成随机数组的方法小结

    这篇文章主要介绍了Python生成随机数组的方法,结合实例形式总结分析了Python使用random模块生成随机数与数组操作相关技巧,需要的朋友可以参考下
    2017-04-04
  • python读写修改Excel之xlrd&xlwt&xlutils

    python读写修改Excel之xlrd&xlwt&xlutils

    这篇文章主要介绍了python读写修改Excel之xlrd&xlwt&xlutils,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • pythotn条件分支与循环详解(3)

    pythotn条件分支与循环详解(3)

    这篇文章主要介绍了Python条件分支和循环用法,结合实例形式较为详细的分析了Python逻辑运算操作符,条件分支语句,循环语句等功能与基本用法,需要的朋友可以参考下
    2021-08-08
  • 用python进行视频剪辑

    用python进行视频剪辑

    这篇文章主要介绍了如何用python进行视频剪辑,帮助大家更好的利用python处理视频,感兴趣的朋友可以了解下
    2020-11-11
  • python deque模块简单使用代码实例

    python deque模块简单使用代码实例

    这篇文章主要介绍了python deque模块简单使用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 浅谈Python对内存的使用(深浅拷贝)

    浅谈Python对内存的使用(深浅拷贝)

    这篇文章主要介绍了浅谈Python对内存的使用(深浅拷贝),具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python图像处理之图像金字塔的向上和向下取样

    Python图像处理之图像金字塔的向上和向下取样

    图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩。本文主要介绍了图像金字塔的图像向下取样和向上取样,感兴趣的可以了解一下
    2022-09-09
  • pandas筛选某列出现编码错误的解决方法

    pandas筛选某列出现编码错误的解决方法

    今天小编就为大家分享一篇pandas筛选某列出现编码错误的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • python 美化输出信息的实例

    python 美化输出信息的实例

    今天小编就为大家分享一篇python 美化输出信息的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python中用max()方法求最大值的介绍

    Python中用max()方法求最大值的介绍

    这篇文章主要介绍了Python中用max()方法求最大值的介绍,是Python入门中的基础知识,需要的朋友可以参考下
    2015-05-05

最新评论