文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-22 07:55

关注

这篇文章给大家介绍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如何实现基于颜色的目标识别

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

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

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

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

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

关于Python+OpenCV如何实现基于颜色的目标识别就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯