Python+OpenCV实现基于颜色的目标识别

程一诺
程一诺
发布时间:2026-10-15 | 4人浏览过
原创

本文介绍使用Python和OpenCV进行基于颜色的目标识别实战。针对固定背景下的气球检测,对比了轮廓提取与颜色识别两种方案,最终选择基于HSV空间的颜色分割方法。通过高斯滤波、腐蚀操作及轮廓过滤,成功提取目标并计算中心点坐标,适用于四足机器人等移动平台场景。

在掌握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)

效果展示

颜色提取效果:

绘制外接矩形及中心点的效果:

关于Python结合OpenCV实现基于颜色的目标识别就介绍到这里。如需了解更多Python与OpenCV相关的颜色识别内容,可搜索本站往期文章或浏览下方相关链接。感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表