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

2022-08-02,,,,

使用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.效果验证

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

《OpenCV实现单目摄像头对图像目标测距.doc》

下载本文的Word格式文档,以方便收藏与打印。