Python:OpenCV4识别一个蓝色的圆并估算到相机的距离

参考:用 Python 和 OpenCV 来测量相机到目标的距离
这位博主对实现过程以及思路解释的很清楚,这里记录下自己的实现过程以及自己的一些理解

注:这个方法有些缺陷,需要参照物体,提前求出一些参数。

识别一个蓝色的圆

直接用画图做了个圆,因为这样情况比较理想,不用反复调参数

import cv2
import numpy as np
import math# 图片路径
img_path = './buleball.jpg'
# 读取图片
img = cv2.imread(img_path)
# 原图
cv2.imshow('org_img', img)# 得到蓝色的HSV指标
blue_lower = np.array([100, 43, 46])
blue_upper = np.array([124, 255, 255])img_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(img_HSV, lowerb= blue_lower, upperb= blue_upper)
img_ball = cv2.bitwise_and(img, img, mask= mask)
cv2.imshow('img_ball', img_ball)# 转换为二值图
img_ball = cv2.cvtColor(img_ball, cv2.COLOR_BGR2GRAY)
__, img_bin = cv2.threshold(img_ball, 10, 255, cv2.THRESH_BINARY)
cv2.imshow('img_bin', img_bin)# 轮廓检测
contours, __ = cv2.findContours(img_bin,  cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 寻找面积最大的轮廓,并获取最小外接矩形
area = []
for i in range(len(contours)):mianji = cv2.contourArea(contours[i])area.append(mianji)
max_area_num = np.argmax(area)
cnt = contours[max_area_num]
print(cnt)
x, y, w, h = cv2.boundingRect(cnt)# 画出最小外接矩形
img_juxing = cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0),2)
cv2.imshow('img_juxing', img_juxing)# 绘制图像中心点到球中心的的连线
x1 = int(x+w/2)
y1 = int(y+h/2)
Center_point_x = int(img.shape[0]/2)
Center_point_y = int(img.shape[1]/2)
img_juxing = cv2.line(img_juxing, (x1,y1), (Center_point_x,Center_point_y),(0,0,255),2)
cv2.imshow('img_zhixian', img_juxing)# 算出连线的长度,即两中心点的距离
s_l = math.pow(abs(Center_point_x - x1), 2)
s_w = math.pow(abs(Center_point_y - y1), 2)
s = int(math.sqrt(s_l + s_w))
print(s)# 打印上距离(单位:像素)
img_juxing = cv2.putText(img, str(s), (x,y), cv2.FONT_HERSHEY_COMPLEX, 1,(255,0,0), 2)
cv2.imshow('img_wenben', img_juxing)
cv2.waitKey(0)

实现效果以及处理过程中的中间图:

下一步:摄像头识别出蓝色的圆并估算距离

识别蓝色的圆以及做到了,接下来就是估算距离
估算距离的方法很简单,借助相似三角形的原理

(图片来自百度)

W:物体的宽度
P:物体的像素宽度
D:已知相机到物体的距离
F:相机焦距

F = (D x P) / W

如图红色的两个三角形是一对近似三角形
焦距F就是通过这对三角形求出的
F不会改变

D’:实际物体到相机的距离

D’= (W x F) / P
再做一个三角形

焦距三角形与待测距离形成的三角形形成一对近似三角形
以此求出D’

注:精度请忽略,已知的三个量为估算出来的

import cv2
import numpy as np
import math# 得到蓝色的HSV指标
blue_lower = np.array([100, 43, 46])
blue_upper = np.array([124, 255, 255])# 已知物体到摄像头的距离(cm)
KNOW_DISTANCE = 50# 计算已知物体对应距离的实际宽(cm)
KONW_OBJECT_WIDTH = 7.48# 计算已知物体对应距离的像素数目
KONW_OBJECT_PWIDTH = 67# 获取摄像头对象
cap = cv2.VideoCapture(0)
# 利用相似三角形计算物体到摄像头的距离
def Get_Distance(W, F, P):''':param W: 已知物体实际宽:param F: 相机的焦距:param P: 物体的像素宽:return:D_str: 返回字符串型的距离'''D = (W * F) / P# 将D 近似为两位小数D = round(D, 2)D_str = str(D)return  D_str# 获取相机的焦距
def Get_LocalLonght(P, D ,W):''':param P: 已知物体像素宽:param D: 相机位置也就是相机距离物体的距离:param W: 已知物体实际宽:return:F:相机的焦距'''F = (P * D) / Wreturn  Fwhile(True):# 读取视频流flag, img = cap.read()# 转换为HSV颜色领域img_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 制作掩膜,保存满足HSV指标的图像,其他过滤掉mask = cv2.inRange(img_HSV, lowerb= blue_lower, upperb= blue_upper)img_ball = cv2.bitwise_and(img, img, mask= mask)# 高斯模糊去噪img_ball = cv2.GaussianBlur(img_ball, (5,5), 0)cv2.imshow('img_ball', img_ball)# 转换为二值图img_ball = cv2.cvtColor(img_ball, cv2.COLOR_BGR2GRAY)# 因为输入图像为灰度图所以阈值也就是亮度, 通过HSV指标过滤后背景还是会有些蓝色的干扰,所以设置一个合适的阈值将那些过亮的干扰过滤掉__, img_bin = cv2.threshold(img_ball, 120, 255, cv2.THRESH_BINARY)cv2.imshow('img_bin', img_bin)# 进行边缘检测,由于边缘检测阈值的限定,会对之后的轮廓检测省下一些操作img_canny = cv2.Canny(img_bin, 150, 250)cv2.imshow('img_canny', img_canny)# 之前试过形态学的一些操作,效果不如边缘检测# kernel = np.ones((9,9), dtype= np.uint8)# img_chli = cv2.erode(img_bin, kernel= kernel, iterations=6)# cv2.imshow('img_erod', img_chli)# img_chli = cv2.dilate(img_chli, kernel= kernel, iterations= 6)# cv2.imshow('img_dil', img_chli)# 轮廓检测contours, __ = cv2.findContours(img_canny,  cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 如果检测到的轮廓不会0if len(contours) != 0:# 寻找面积最大的轮廓,并获取最小外接矩形area = []for i in range(len(contours)):mianji = cv2.contourArea(contours[i])area.append(mianji)area = np.array(area, dtype= np.uint8)# 获取最大面积索引max_area_num = np.argmax(area)# 获取最大面积的轮廓cnt = contours[max_area_num]# 求它的外接矩形x, y, w, h = cv2.boundingRect(cnt)# 画出最小外接矩形img_juxing = cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0),2)# 获取相机焦距F = Get_LocalLonght(KONW_OBJECT_PWIDTH, KNOW_DISTANCE, KONW_OBJECT_WIDTH)# 获取已经转换成字符串的距离D_STR = Get_Distance(KONW_OBJECT_WIDTH, F, w)# 打印距离img_juxing = cv2.putText(img, "distance:" + D_STR + "cm", (0,30), cv2.FONT_HERSHEY_COMPLEX, 1.5, (0,255,0), bottomLeftOrigin= False)cv2.imshow('img_juxing', img_juxing)if cv2.waitKey(1) == ord('q'):breakcv2.destroyAllWindows()
cap.release()

注:这里的相关参数和环境有着很大的关系,尤其是亮度HSV颜色领域不可不避免的问题,并且和被检测物品有很大的关系。
需要自己进行调整。蓝色衣服作为干扰被加入了检测图像中。用手机是因为这样亮度的影响较小,

在当前环境且不改变参数的情况下的检测效果(视频中绿框在一定距离范围跳动比较频繁)

结语

如有错误,还请评论指出。

Python:OpenCV4识别一个蓝色的圆并估算到相机的距离相关推荐

  1. 使用ZED相机识别颜色醒目的水壶并计算与相机的距离

    这是以前做的小项目里的一部分,由于时间久远,在这里整理以下,也方便自己以后查阅. 前期准备 ZED-stereo是很好用功能强大的双目相机,可以调用自带的库直接读取点云数据,也可以很方便获得图像任意一 ...

  2. 使用python绘制一个渐变色的圆

    1,引入海龟绘图 import turtle as t 2,基本操作,绘制一个蓝色的圆 #设置圆颜色 t.color('blue') #开始绘制 t.begin_fill() #参数redius=10 ...

  3. Python3.8(pycharm) + OpenCV4 识别二维码

    Python + OpenCV4 识别二维码 在opencv4中集成了识别二维码的库,所以只需要简单的库函数调用就可以就可以实现识别二维码了 废话不多说直接上代码 import cv2 as cv i ...

  4. python画多个圆_python turtle库画一个方格和圆实例

    python turtle库画一个方格和圆实例 使用python的turtle库画一个方格和圆 打开python编译器,导入turtle库 from turtle import * 首先画一个距离为1 ...

  5. 精通 Python OpenCV4:第二部分

    原文:Mastering OpenCV 4 with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MTPE)流程来尽 ...

  6. 精通 Python OpenCV4:第三、四部分

    原文:Mastering OpenCV 4 with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MTPE)流程来尽 ...

  7. python人脸识别神器_教你用Python人脸识别自动开机,值得收藏

    这里将告诉您教你用Python人脸识别自动开机,值得收藏,具体操作方法:是不是厌烦了每次回家都要点击按钮打开电脑的操作? 你如果有看过我以前的推送,是不是厌烦了每次回家都要喊 "echo,t ...

  8. python 颜色识别_在python中构建颜色识别器

    python 颜色识别 In this post, I will show you how to build your own color recognizer using Python. This ...

  9. python形状识别算法_Python人工智能使用OpenCV进行图片形状的中心检测

    我们都知道正方形(长方形)的中心是2条对角线的交点,圆的中心是一个圆的圆心,如何在对象检测以及图片检测与识别领域,判断一个形状的中心,便是计算机视觉领域中的一个基础检测 中心检测 Opencv+pyt ...

最新文章

  1. xmpp协议抓包_开源网络抓包与分析框架学习-Packetbeat篇
  2. windows8.1 windows defender service无法启动解决方案
  3. Nginx系列~负载均衡服务器与WWW服务器的实现
  4. SQ_20200326_Z-TEK主动式USB-5m延长线对于Intel Realsense D435掉线情况测试
  5. osg 倾斜数据纹理_高科技构筑逼真效果——无人机倾斜摄影技术在实景三维建模的应用及展望...
  6. HTML5语义化的理解
  7. 【壹个小技巧】一看就会的CI/CD :Github Actions
  8. Logtail从入门到精通(三):机器分组配置
  9. oracle安装向导卡住了_JDK 8 的安装与配置
  10. 唐中印 项目管理实战专家简介
  11. SpringBoot集成Cache缓存(Redis缓存,RedisTemplate方式)
  12. c语言atm实训报告总体框架图,实训报告-ATM.doc
  13. 计算机硬盘驱动器越大,计算机硬盘驱动器的使用寿命是多少
  14. Windows10中microsoft商店打不开解决办法
  15. 【OI好题推荐 #1】洛谷-P1183 多边形的面积
  16. ABSOLUTE评估肿瘤纯度
  17. STK12已出,STK 12 新特性介绍
  18. 编写模板类时注意一点 2007-12-06 11:22
  19. Ubuntu18.04安装Fcitx中文输入法
  20. OpenCV(6):基于本地库的图像识别软件(批量读取图片)

热门文章

  1. window.addEventListener()和document.addEventListener()区别
  2. iOS 作为蓝牙外设广播信息
  3. 蓝牙BLEBLEcc2540开启广播的过程
  4. 什么是堡垒机?堡垒机有何优势?
  5. A. Good Pairs
  6. 国内外网站空间优劣势
  7. 光模块(光口)和电模块(电口)
  8. 【spring的使用方法】
  9. 设备中LPC2368芯片个例参数问题导致故障的分析
  10. R语言中敏感性和特异性、召回率和精确度作为选型标准的华夫图案例