• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
123457886 显示全部楼层 发表于 2022-1-8 06:53:47 |阅读模式 打印 上一主题 下一主题
目录


  • 使命
  • 重要代码
  • 效果展示
学习了一点opencv的知识于是找了个小项目来实践一下。这里先阐明一下,我的实现方法不见得是最好的(由于这只是一个用于练习的项目)仅作参考,也接待各位大佬指正。

使命

让摄像头辨认到视野范围内的气球并返回每个气球的中心点坐标。

由于园地固定,配景单一,以是省下来许多操纵和处置处罚。于是就有两种办理思路:第一种是基于气球外形做表面提取,只要是闭合椭圆或圆形形就以为是目标物体;第二种是基于气球颜色,只要符合目标物体的颜色就以为是目标物体。
由于摄像头是装在四足呆板人(它的使命是去扎气球)身上的,以是它如果移动到摄像头视野范围内气球不成闭合椭圆或圆形的时间就无法辨认了,再加上园地灯光而产生的阴影的题目,在开端实践中发现颠末图像处置处罚的气球不肯定是闭合球形的。以是这种方法被我否决了。
于是我就采用了第二种方法,实现思路大概如下:
首先对图像举行形态学处置处罚,具体为将读入的灰度图举行一次滤波操纵,将图像转化成HSV图,然后举行腐蚀操纵。接着就对目标颜色举行辨认和提取。然后提取图像的表面,过滤掉表面围成面积较小的物体后将剩余物体视为目标。接下来就绘制目标的外接矩形(不须要,用于调试。当然也为了帅气的视觉效果)。末了计算目标的中心点,返回中心点,并绘制在图上。
话不多说我们来看一下具体的代码实现吧

重要代码
  1. import cv2
  2. #import matplotlib.pyplot as plt
  3. import numpy as np
  4. #定义一个展示图片的函数
  5. def cv_show(name,img):
  6.     cv2.imshow(name,img)
  7.     cv2.waitKey(0)
  8.     cv2.destroyAllWindows()
  9. #定义一个形态学处理的函数
  10. def good_thresh_img(img):
  11.     gs_frame = cv2.GaussianBlur(img, (5, 5), 0)                     #高斯滤波
  12.     hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)                 # 转化成HSV图像
  13.     erode_hsv = cv2.erode(hsv, None, iterations=2)
  14.     return erode_hsv
  15. #定义一个识别目标颜色并处理的函数
  16. def select_color_img(target_color,img):
  17.         for i in target_color:
  18.             mask=cv2.inRange(erode_hsv,color_dist[i]['Lower'],color_dist[i]['Upper'])
  19.             if(i==target_color[0]):
  20.                 inRange_hsv=cv2.bitwise_and(erode_hsv,erode_hsv,mask = mask)
  21.                 cv_show('res',inRange_hsv)#不必要,用于调试
  22.             else:
  23.                 inRange_hsv1=cv2.bitwise_and(erode_hsv,erode_hsv,mask = mask)
  24.                 cv_show('res1',inRange_hsv1)#不必要,用于调试
  25.                 inRange_hsv=cv2.add(inRange_hsv,inRange_hsv1)
  26.                 cv_show('res2',inRange_hsv)#不必要,用于调试
  27.         return  inRange_hsv
  28. #定义一个提取轮廓的函数
  29. def extract_contour(img):
  30.     inRange_gray = cv2.cvtColor(final_inRange_hsv,cv2.COLOR_BGR2GRAY)
  31.     contours,hierarchy = cv2.findContours(inRange_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
  32.     return contours
  33.    
  34. #定义一个寻找目标并绘制外接矩形的函数
  35. def find_target(contours,draw_img):
  36.     for c in contours:
  37.         if cv2.contourArea(c) < 2000:             #过滤掉较面积小的物体
  38.             continue
  39.         else:
  40.             target_list.append(c)               #将面积较大的物体视为目标并存入目标列表
  41.     for i in target_list:                       #绘制目标外接矩形
  42.         rect = cv2.minAreaRect(i)
  43.         box = cv2.boxPoints(rect)
  44.         cv2.drawContours(draw_img, [np.int0(box)], -1, (0, 255, 255), 2)
  45.     return draw_img
  46. #定义一个绘制中心点坐标的函数
  47. def draw_center(target_list,draw_img):
  48.     for  c in target_list:
  49.         M = cv2.moments(c)                   #计算中心点的x、y坐标
  50.         center_x = int(M['m10']/M['m00'])
  51.         center_y = int(M['m01']/M['m00'])
  52.         print('center_x:',center_x)          #打印(返回)中心点的x、y坐标
  53.         print('center_y:',center_y)
  54.    
  55.         cv2.circle(draw_img,(center_x,center_y),7,128,-1)#绘制中心点
  56.         str1 = '(' + str(center_x)+ ',' +str(center_y) +')' #把坐标转化为字符串
  57.         cv2.putText(draw_img,str1,(center_x-50,center_y+40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),2,cv2.LINE_AA)#绘制坐标点位
  58.    
  59.     return draw_img
  60. ###主函数部分
  61. #创建颜色字典
  62. color_dist = {'red': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([6, 255, 255])},
  63.               'yellow': {'Lower': np.array([15, 160, 50]), 'Upper': np.array([35, 255, 255])},
  64.               'green': {'Lower': np.array([50, 50, 50]), 'Upper': np.array([130, 255, 255])},
  65.               }
  66. #目标颜色
  67. target_color = ['green','yellow']
  68. #创建目标列表
  69. target_list=[]
  70. img = cv2.imread(r'D:lesson\balloom.jpg',cv2.COLOR_BGR2RGB)       #读入图像(直接读入灰度图)
  71. draw_img = img.copy()                             #为保护原图像不被更改而copy了一份,下面对图像的修改都是对这个副本进行的
  72. erode_hsv = good_thresh_img(img)
  73. final_inRange_hsv = select_color_img(target_color,erode_hsv)
  74. contours = extract_contour(final_inRange_hsv)
  75. draw_img = find_target(contours,draw_img)
  76. final_img = draw_center(target_list,draw_img)
  77. cv_show('final_img',final_img)
复制代码
效果展示

颜色提取效果:



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


到此这篇关于Python+OpenCV实现基于颜色的目标辨认的文章就先容到这了,更多相关Python OpenCV基于颜色的目标辨认内容请搜刮脚本之家从前的文章或继续欣赏下面的相关文章希望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作