Python+OpenCV如何实现基于颜色的目标识别
发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,这篇文章给大家介绍Python+OpenCV如何实现基于颜色的目标识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。任务让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。
千家信息网最后更新 2024年11月17日Python+OpenCV如何实现基于颜色的目标识别
这篇文章给大家介绍Python+OpenCV如何实现基于颜色的目标识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
任务
让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。
因为场地固定,背景单一,所以省下来很多操作和处理。于是就有两种解决思路:第一种是基于气球形状做轮廓提取,只要是闭合椭圆或圆形形就认为是目标物体;第二种是基于气球颜色,只要符合目标物体的颜色就认为是目标物体。
因为摄像头是装在四足机器人(它的任务是去扎气球)身上的,所以它如果移动到摄像头视野范围内气球不成闭合椭圆或圆形的时候就无法识别了,再加上场地灯光而产生的阴影的问题,在初步实践中发现经过图像处理的气球不一定是闭合球形的。所以这种方法被我否决了。
于是我就采用了第二种方法,实现思路大概如下:
首先对图像进行形态学处理,具体为将读入的灰度图进行一次滤波操作,将图像转化成HSV图,然后进行腐蚀操作。接着就对目标颜色进行识别和提取。然后提取图像的轮廓,过滤掉轮廓围成面积较小的物体后将剩余物体视为目标。接下来就绘制目标的外接矩形(不必要,用于调试。当然也为了帅气的视觉效果)。最后计算目标的中心点,返回中心点,并绘制在图上。
话不多说我们来看一下具体的代码实现吧
主要代码
import cv2#import matplotlib.pyplot as pltimport 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)
效果展示
颜色提取效果:
绘制外接矩形及中心点的效果:
关于Python+OpenCV如何实现基于颜色的目标识别就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
目标
颜色
中心点
函数
图像
气球
坐标
物体
处理
效果
矩形
轮廓
摄像头
面积
摄像
闭合
代码
任务
内容
圆形
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
穿越火线西部的服务器在哪儿
数据库数组是什么类型
怀化直销软件开发公司
软件更改数据库
2022网络安全知识内容
维姆网络服务器延迟
服务器最安全登录方式
数据库检索方法一般有
matebook适合软件开发
网络安全责任大宣传
校园网络安全管理使用制度
桓台陶瓷软件开发服务
我的世界服务器闪电
office连接服务器错误
数据库如何实行两行相减
外国网络安全部门
delphi7数据库怎么创建
plsql怎么查看数据库表结构
软件开发 创业 办理
河南新一代软件开发设施品质保障
应用语言学软件开发
软件开发工作计划范文
国家地质图数据库
域名服务器没有网站列表
mpa数据库
ccm网络安全
delphi7数据库怎么创建
英国的软件开发公司名称
如何获取数据库中最新的思路
滴滴事件对网络安全股票的影响