Python+OpenCV实现基于颜色的目标识别
作者:a_growing_tree 发布时间:2022-10-28 02:57:27
标签:Python,OpenCV,颜色,目标识别
学习了一点opencv的知识于是找了个小项目来实践一下。这里先说明一下,我的实现方法不见得是最好的(因为这只是一个用于练习的项目)仅作参考,也欢迎各位大佬指正。
任务
让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。
因为场地固定,背景单一,所以省下来很多操作和处理。于是就有两种解决思路:第一种是基于气球形状做轮廓提取,只要是闭合椭圆或圆形形就认为是目标物体;第二种是基于气球颜色,只要符合目标物体的颜色就认为是目标物体。
因为摄像头是装在四足机器人(它的任务是去扎气球)身上的,所以它如果移动到摄像头视野范围内气球不成闭合椭圆或圆形的时候就无法识别了,再加上场地灯光而产生的阴影的问题,在初步实践中发现经过图像处理的气球不一定是闭合球形的。所以这种方法被我否决了。
于是我就采用了第二种方法,实现思路大概如下:
首先对图像进行形态学处理,具体为将读入的灰度图进行一次滤波操作,将图像转化成HSV图,然后进行腐蚀操作。接着就对目标颜色进行识别和提取。然后提取图像的轮廓,过滤掉轮廓围成面积较小的物体后将剩余物体视为目标。接下来就绘制目标的外接矩形(不必要,用于调试。当然也为了帅气的视觉效果)。最后计算目标的中心点,返回中心点,并绘制在图上。
话不多说我们来看一下具体的代码实现吧
主要代码
import cv2
#import matplotlib.pyplot as plt
import numpy as np
#定义一个展示图片的函数
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#定义一个形态学处理的函数
def good_thresh_img(img):
gs_frame = cv2.GaussianBlur(img, (5, 5), 0) #高斯滤波
hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV) # 转化成HSV图像
erode_hsv = cv2.erode(hsv, None, iterations=2)
return erode_hsv
#定义一个识别目标颜色并处理的函数
def select_color_img(target_color,img):
for i in target_color:
mask=cv2.inRange(erode_hsv,color_dist[i]['Lower'],color_dist[i]['Upper'])
if(i==target_color[0]):
inRange_hsv=cv2.bitwise_and(erode_hsv,erode_hsv,mask = mask)
cv_show('res',inRange_hsv)#不必要,用于调试
else:
inRange_hsv1=cv2.bitwise_and(erode_hsv,erode_hsv,mask = mask)
cv_show('res1',inRange_hsv1)#不必要,用于调试
inRange_hsv=cv2.add(inRange_hsv,inRange_hsv1)
cv_show('res2',inRange_hsv)#不必要,用于调试
return inRange_hsv
#定义一个提取轮廓的函数
def extract_contour(img):
inRange_gray = cv2.cvtColor(final_inRange_hsv,cv2.COLOR_BGR2GRAY)
contours,hierarchy = cv2.findContours(inRange_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
return contours
#定义一个寻找目标并绘制外接矩形的函数
def find_target(contours,draw_img):
for c in contours:
if cv2.contourArea(c) < 2000: #过滤掉较面积小的物体
continue
else:
target_list.append(c) #将面积较大的物体视为目标并存入目标列表
for i in target_list: #绘制目标外接矩形
rect = cv2.minAreaRect(i)
box = cv2.boxPoints(rect)
cv2.drawContours(draw_img, [np.int0(box)], -1, (0, 255, 255), 2)
return draw_img
#定义一个绘制中心点坐标的函数
def draw_center(target_list,draw_img):
for c in target_list:
M = cv2.moments(c) #计算中心点的x、y坐标
center_x = int(M['m10']/M['m00'])
center_y = int(M['m01']/M['m00'])
print('center_x:',center_x) #打印(返回)中心点的x、y坐标
print('center_y:',center_y)
cv2.circle(draw_img,(center_x,center_y),7,128,-1)#绘制中心点
str1 = '(' + str(center_x)+ ',' +str(center_y) +')' #把坐标转化为字符串
cv2.putText(draw_img,str1,(center_x-50,center_y+40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),2,cv2.LINE_AA)#绘制坐标点位
return draw_img
###主函数部分
#创建颜色字典
color_dist = {'red': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([6, 255, 255])},
'yellow': {'Lower': np.array([15, 160, 50]), 'Upper': np.array([35, 255, 255])},
'green': {'Lower': np.array([50, 50, 50]), 'Upper': np.array([130, 255, 255])},
}
#目标颜色
target_color = ['green','yellow']
#创建目标列表
target_list=[]
img = cv2.imread(r'D:lesson\balloom.jpg',cv2.COLOR_BGR2RGB) #读入图像(直接读入灰度图)
draw_img = img.copy() #为保护原图像不被更改而copy了一份,下面对图像的修改都是对这个副本进行的
erode_hsv = good_thresh_img(img)
final_inRange_hsv = select_color_img(target_color,erode_hsv)
contours = extract_contour(final_inRange_hsv)
draw_img = find_target(contours,draw_img)
final_img = draw_center(target_list,draw_img)
cv_show('final_img',final_img)
效果展示
颜色提取效果:
绘制外接矩形及中心点的效果:
来源:https://blog.csdn.net/a_growing_tree/article/details/122288348
0
投稿
猜你喜欢
- 本文实例讲述了Python tkinter模块弹出窗口及传值回到主窗口操作。分享给大家供大家参考,具体如下:有些时候,我们需要使用弹出窗口,
- 使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作。我们可以使用 if else 进行判断,但是,既然使用了
- 本文实例讲述了Django实现简单分页功能的方法。分享给大家供大家参考,具体如下:使用django的第三方模块django-pure-pag
- 疫情还没结束,小编只能宅在家里,哪哪也去不了,今天突发奇想给大家分享一篇教程关于Python paramiko 模块浅谈与SSH主要功能模拟
- 文章出处:https://blog.csdn.net/sdksdk0/article/details/80933444作者:朱培
- TensorFlow 2.0测试版在今年春季发布,新版本比1.x版本在易用性上有了很大的提升。但是由于2.0发布还没有多久,现在大部分论文的
- 1.类方法类方法是从属于"类对象"的方法。类对象可以通过装饰器@classmethod来定义,具体格式如下:@class
- 本文实例讲述了PHP简单检测网址是否能够正常打开的方法。分享给大家供大家参考,具体如下:这是一个检测网址是否能正常打开的PHP代码,通过下面
- 一、handlers是什么?logging模块中包含的类用来自定义日志对象的规则(比如:设置日志输出格式、等级等)常用3个子类:Stream
- 经常存在在我们的电脑中的垃圾文件主要是指系统在运行过程中产生的tmp临时文件、日志文件、临时备份文件等。垃圾清理器的作用其实也是对这些文件进
- 相信只要学习python的同学对于虚拟环境这个概念肯定不会太陌生,虚拟环境指的是一个个单独隔离的python开发环境。各个虚拟环境之间互不干
- 本文实例讲述了python递归计算N!的方法。分享给大家供大家参考。具体实现方法如下:def factorial(n): if
- 安装前的准备1.python的安装和配置在Window下:在开始菜单中找到运行输入cmd或直接搜索cmd点击进入,输入python,如果出现
- 引言语音端点检测最早应用于电话传输和检测系统当中,用于通信信道的时间分配,提高传输线路的利用效率.端点检测属于语音处理系统的前端操作,在语音
- 隐藏并修改文件的最后修改时间的asp-webshell。源码:<% '隐藏并修改文件的最后修改时间的aspshell '
- 发布Python包上一篇介绍了如何使用别人的轮子,现在我们讨论下如何自己造轮子给别人用。作为一个流行的开源开发项目,Python拥有一个活跃
- 本文实例为大家分享了python3实现多张图片附件邮件发送的具体代码,供大家参考,具体内容如下直接上代码,没有注释!from email.m
- 一、介绍Python:python代码解释器,用于编译.py代码,python可以单独安装,本次环境配置目的用于解决计算机视觉处理,因此选用
- Dataframe使用loc取某几行几列的数据:print(df.loc[0:4,['item_price_level',&
- 在python中,通过如下两个模块可以实现邮件的自动化操作smtplibemailsmtplib模块是对SMTP协议的封装,用于发送邮件;e