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

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

(0)

相关推荐

  • 基于OpenCV的摄像头测距的实现示例

    目录 前言 一.测距原理 二.代码 1.引入库 2.读入数据 总结 前言 去年暑假参加了一个比赛,比赛内容中需要确定目标的位置 本来想全用图像完成的,最后发现不是很符合要求.比完赛之后,就忙别的事了.直到现在突然想试试摄像头测距.就来了 一.测距原理 摄像头单目测距原理及实现 空间的深度或距离等数据的摄像头. 人的眼睛长在头部的前方,两只眼的视野范围重叠,两眼同时看某一物体时,产生的视觉称为双眼视觉. 双眼视觉的优点是可以弥补单眼视野中的盲区缺损,扩大视野,并产生立体视觉. f为摄像头的焦距,c

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

    使用opencv对单目摄像头中的目标实现测量距离(python实现),供大家参考,具体内容如下 1.方法介绍: 根据相似三角形的方法: F = P×D / W , 其中W为物体的实际宽度,D为物体平面与相机平面的距离,照片上物体的像素宽度为P,相机焦距为FD = F×W / P ,这样知道相机的内参焦距就可以求得物体平面与相机平面的距离D 2.代码: import cv2 import imutils import numpy as np from imutils import paths #

  • OpenCV实现单目尺寸估计的案例详解

    一个摄像头无法获取深度信息,两个摄像头双目标定可以实现双目测距. 但是我现在只有一个摄像头,如果想实现测量尺寸,我的思路:选一张固定尺寸的背景,例如一张A4纸,从图像中提取A4纸并进行透视变换进行图像矫正,A4纸的尺寸我可以确定,那么也可以确定图像中的物体长宽信息(高度忽略不计的情况,例如:卡片).当摄像头距离目标物距离L,此时像素所占面积为S,那么理论上来说,目标物图像变化后的面积为S1,则距离L1=(L/S)*S1,假定目标物上面贴有很多个面积为1平方厘米的正方形贴纸,那么获取四个角点和四条

  • Python Opencv实现单目标检测的示例代码

    一 简介 目标检测即为在图像中找到自己感兴趣的部分,将其分割出来进行下一步操作,可避免背景的干扰.以下介绍几种基于opencv的单目标检测算法,算法总体思想先尽量将目标区域的像素值全置为1,背景区域全置为0,然后通过其它方法找到目标的外接矩形并分割,在此选择一张前景和背景相差较大的图片作为示例. 环境:python3.7 opencv4.4.0 二 背景前景分离 1 灰度+二值+形态学 轮廓特征和联通组件 根据图像前景和背景的差异进行二值化,例如有明显颜色差异的转换到HSV色彩空间进行分割. 1

  • 基于python opencv单目相机标定的示例代码

    相机固定不动,通过标定版改动不同方位的位姿进行抓拍 import cv2 camera=cv2.VideoCapture(1) i = 0 while 1: (grabbed, img) = camera.read() cv2.imshow('img',img) if cv2.waitKey(1) & 0xFF == ord('j'): # 按j保存一张图片 i += 1 u = str(i) firename=str('./img'+u+'.jpg') cv2.imwrite(firename

  • C++利用opencv实现单目测距的实现示例

    闲来无事,用C++做了一个简易的单目测距.算法用的cv自带的,改改参数就行.实现了读取照片测距,读取笔记本摄像头测距,读取视频测距三个功能. 为什么不用双目测距?因为没钱买摄像头-- 原理:相似三角形原理,已知焦距的情况下检测被测物在图片中所占的像素宽度来判断被测物与摄像头的距离,同时也可以得出被测物的大概长宽.注意:摄像头要和被测物体平行,如果不平行在侧面看来摄像头和物体之间的连线就与水平方向有一个夹角a,被测物体在图片中的大小会受到影响,从而影响测量效果. 误差分析:导致测量效果不好的原因有

  • 如何基于python实现单目三维重建详解

    目录 一.单目三维重建概述 二.实现过程 (1)相机的标定 (2)图像特征提取及匹配 (3)三维重建 三.结论 四.代码 总结 一.单目三维重建概述 客观世界的物体是三维的,而我们用摄像机获取的图像是二维的,但是我们可以通过二维图像感知目标的三维信息.三维重建技术是以一定的方式处理图像进而得到计算机能够识别的三维信息,由此对目标进行分析.而单目三维重建则是根据单个摄像头的运动来模拟双目视觉,从而获得物体在空间中的三维视觉信息,其中,单目即指单个摄像头. 二.实现过程 在对物体进行单目三维重建的过

  • OpenCV半小时掌握基本操作之图像基础操作

    目录 概述 截取图像 获取颜色通道 读取视频 [OpenCV]⚠️高手勿入! 半小时学会基本操作⚠️ 图像基础操作 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. 截取图像 例子: # 截取图像 img = cv2.imread("picture.jpg") img = img[200:600, 400:1000] cv2.imshow("cut", img) cv2.waitKey(

  • Python+OpenCV+pyQt5录制双目摄像头视频的实例

    起因 说起来录制视频,我们可能有很多的软件,但是比较坑的是,好像很少的软件支持能够同时录制两个摄像头的视频,于是我们用python自己写一个.要是OpenCV+python.貌似很简单就能OK的事情,但是,我们的项目不是一般要展示给老师看嘛.谁愿意看一个没有界面的录制过程是吧~,最后会附上源代码~ 依赖的包 在这里,我直接把import的包写出来了各位可以进行对号入座,然后就能知道需要安装哪个包啦! import cv2 import numpy as np from PyQt5.QtWidge

  • OpenCV图像分割之分水岭算法与图像金字塔算法详解

    目录 前言 一.使用分水岭算法分割图像 1.cv2.distanceTransform()函数 2.cv2.connectedComponents()函数 3.cv2.watershed()函数 二.图像金字塔 1.高斯金字塔向下采样 2.高斯金字塔向上采样 3.拉普拉斯金字塔 4.应用图像金字塔实现图像的分割和融合 前言 主要介绍OpenCV中的分水岭算法.图像金字塔对图像进行分割的方法. 一.使用分水岭算法分割图像 分水岭算法的基本原理为:将任意的灰度图像视为地形图表面,其中灰度值高的部分表

  • Python+OpenCV绘制多instance的Mask图像

    目标:Mask中,不同值表示不同的实例(instance),在原图中,绘制不同的instance实例,每个实例用不同颜色表示,实例边界用白色表示. 源码: def generate_colors(n_colors, seed=47): """ 随机生成颜色 """ np.random.seed(seed) color_list = [] for i in range(n_colors): color = (np.random.random((1,

随机推荐