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

 更新时间:2022年01月04日 17:07:12   作者:a_growing_tree  
这篇文章主要介绍了利用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)

效果展示

颜色提取效果:

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

到此这篇关于Python+OpenCV实现基于颜色的目标识别的文章就介绍到这了,更多相关Python OpenCV基于颜色的目标识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python切割图片成九宫格的示例代码

    Python切割图片成九宫格的示例代码

    这篇文章主要介绍了Python切割图片成九宫格的相关知识,本文通过截图实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 手把手教你实现Python重试超时装饰器

    手把手教你实现Python重试超时装饰器

    这篇文章主要为大家介绍了实现Python重试超时装饰器教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2023-05-05
  • Django中celery的使用项目实例

    Django中celery的使用项目实例

    Celery是⼀个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理,下面这篇文章主要给大家介绍了关于Django中celery使用的相关资料,需要的朋友可以参考下
    2022-07-07
  • python中Array和DataFrame相互转换的实例讲解

    python中Array和DataFrame相互转换的实例讲解

    在本篇文章里小编给大家整理的是一篇关于python中Array和DataFrame相互转换的实例讲解内容,对此有需要的朋友们可以学参考下。
    2021-02-02
  • 详解Python如何获取列表(List)的中位数

    详解Python如何获取列表(List)的中位数

    本文通过图文及实例代码介绍了怎样利用python获取列表的中位数,文章介绍的很详细,有需要的小伙伴们可以参考学习。
    2016-08-08
  • Python使用pickle模块报错EOFError Ran out of input的解决方法

    Python使用pickle模块报错EOFError Ran out of input的解决方法

    这篇文章主要介绍了Python使用pickle模块报错EOFError Ran out of input的解决方法,涉及Python异常捕获操作处理相关使用技巧,需要的朋友可以参考下
    2018-08-08
  • Python绘制计算机CPU占有率变化的折线图

    Python绘制计算机CPU占有率变化的折线图

    这篇文章主要为大家详细介绍了Python绘制计算机CPU占有率变化的折线图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 关于Python字符编码与二进制不得不说的一些事

    关于Python字符编码与二进制不得不说的一些事

    这篇文章主要给大家介绍了关于Python字符编码与二进制不得不说的一些事,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 如何利用Python将html转为pdf、word文件

    如何利用Python将html转为pdf、word文件

    网络上存在很多将HTML转换为PDF的软件和工具,但是大家都知道收费,所以下面这篇文章主要给大家介绍了关于如何利用Python将html转为pdf、word文件的相关资料,文中通过示例代码介绍介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • python爬取热搜制作词云

    python爬取热搜制作词云

    这篇文章主要介绍了python爬取百度热搜制作词云,首先爬取百度热搜,至少间隔1小时,存入文件,避免重复请求,如果本1小时有了不再请求,存入数据库,供词云包使用,爬取热搜,具体流程请需要的小伙伴参考下面文章内容
    2021-12-12

最新评论