Python+OpenCV如何实现基于颜色的目标识别
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章给大家介绍Python+OpenCV如何实现基于颜色的目标识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。任务让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。
千家信息网最后更新 2025年11月08日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安全错误
数据库的锁怎样保障安全
俄乌冲突引发全球网络安全
互联网金融前沿科技技术
软件开发工程师数据库
用友结账标志的两个数据库表
小软件开发者
浙江最大的软件开发公司
网络安全保密性的主要防范措施是
数据库加密技术的优缺点
谈谈我国网络安全的重要意义
insert数据库没用
知道公司服务器ip地址怎么连
华为云数据库最新价格
咪咕音乐网络安全招标
北京云翳互联网络科技有限公司
在关系数据库中使用数据
综合软件开发私人定做
兰州哪有卖二手服务器的市场
计算机网络技术面试常见问题
网络安全你我他手
立体的网络安全
计算机网络安全专业研究生院校
ldap服务器下载
同济数据库技术基础
携手共建网络安全心得体会
php数据库操作类
美国sk高防服务器
网易企业邮箱服务器名称
all any数据库
实用网络技术课程论文
小型数据库如何开发