• 售前

  • 售后

热门帖子
入门百科

OpenCV基于颜色的目标辨认(入门简单摄像头版)

[复制链接]
温润而哲 显示全部楼层 发表于 2022-1-16 18:35:02 |阅读模式 打印 上一主题 下一主题
接上篇OpenCV基于颜色辨认目标(入门简单图片版)
这次参加了摄像头
实现思绪:视频着实就是每一张图片的叠加,只要对视频中的每一帧读入并作处置惩罚,就能实现对视频流中目标的辨认。以是这里我们只要将读入图像和处置惩罚图像的利用放入while循环中就能实现及时的辨认目标了。
具体代码实现
  1. import cv2
  2. import numpy as np
  3. import os
  4. os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
  5. #定义一个形态学处理的函数
  6. def good_thresh_img(img):
  7.     gs_frame = cv2.GaussianBlur(img, (5, 5), 0)                     #高斯滤波
  8.     hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)                 # 转化成HSV图像
  9.     erode_hsv = cv2.erode(hsv, None, iterations=2)
  10.     return erode_hsv
  11. #定义一个识别目标颜色并处理的函数
  12. def select_color_img(target_color,img):
  13.         for i in target_color:
  14.             mask=cv2.inRange(erode_hsv,color_dist[i]['Lower'],color_dist[i]['Upper'])
  15.             if(i==target_color[0]):
  16.                 inRange_hsv=cv2.bitwise_and(erode_hsv,erode_hsv,mask = mask)
  17.             else:
  18.                 inRange_hsv1=cv2.bitwise_and(erode_hsv,erode_hsv,mask = mask)
  19.                 inRange_hsv=cv2.add(inRange_hsv,inRange_hsv1)
  20.         return  inRange_hsv
  21. #定义一个提取轮廓的函数
  22. def extract_contour(img):
  23.     inRange_gray = cv2.cvtColor(final_inRange_hsv,cv2.COLOR_BGR2GRAY)
  24.     contours,hierarchy = cv2.findContours(inRange_gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
  25.     return contours
  26.    
  27. #定义一个寻找目标并绘制外接矩形的函数
  28. def find_target(contours,draw_img):
  29.     for c in contours:
  30.         if cv2.contourArea(c) < 2000:             #过滤掉较面积小的物体
  31.             continue
  32.         else:
  33.             target_list.append(c)               #将面积较大的物体视为目标并存入目标列表
  34.     for i in target_list:                       #绘制目标外接矩形
  35.         rect = cv2.minAreaRect(i)
  36.         box = cv2.boxPoints(rect)
  37.         cv2.drawContours(draw_img, [np.int0(box)], -1, (0, 255, 255), 2)
  38.     return draw_img
  39. #定义一个绘制中心点坐标的函数
  40. def draw_center(target_list,draw_img):
  41.     for  c in target_list:
  42.         M = cv2.moments(c)                   #计算中心点的x、y坐标
  43.         center_x = int(M['m10']/M['m00'])
  44.         center_y = int(M['m01']/M['m00'])
  45.         print('center_x:',center_x)
  46.         print('center_y:',center_y)
  47.    
  48.         cv2.circle(draw_img,(center_x,center_y),7,128,-1)#绘制中心点
  49.         str1 = '(' + str(center_x)+ ',' +str(center_y) +')' #把坐标转化为字符串
  50.         cv2.putText(draw_img,str1,(center_x-50,center_y+40),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,0),2,cv2.LINE_AA)#绘制坐标点位
  51.    
  52.     return draw_img
  53. ###主函数部分
  54. #创建颜色字典
  55. color_dist = {'red': {'Lower': np.array([0, 60, 60]), 'Upper': np.array([6, 255, 255])},
  56.               'yellow': {'Lower': np.array([15, 160, 50]), 'Upper': np.array([35, 255, 255])},
  57.               'green': {'Lower': np.array([50, 50, 50]), 'Upper': np.array([130, 255, 255])},
  58.               }
  59. #目标颜色
  60. target_color = ['green','yellow']
  61. #创建摄像头
  62. capture = cv2.VideoCapture(0)
  63. #target_list=[]
  64. while True:
  65.     #创建目标列表。注意一定要将其放入循环中,可以尝试一下将这一行注释掉,把目标列表建在外面,看看区别
  66.     target_list=[]
  67.    
  68.     ret, img = capture.read()
  69.     draw_img = img
  70.     erode_hsv = good_thresh_img(img)
  71.     final_inRange_hsv = select_color_img(target_color,erode_hsv)
  72.     contours = extract_contour(final_inRange_hsv)
  73.     draw_img = find_target(contours,draw_img)
  74.     final_img = draw_center(target_list,draw_img)
  75.     cv2.imshow('final_img',final_img)
  76.     key = cv2.waitKey(1)
  77.     if key!=-1:       #按除了-1的任意键退出
  78.         break
  79. cv2.destroyAllWindows()      #关闭展示窗口
  80. capture.release()            #释放摄像头,若不释放,程序结束后摄像头一直处于开启状态
复制代码
标题总结:相识了视频的原理后,以为只要把每一帧处置惩罚好然后放入循环里就ok了,没想到实际利用起来照旧会遇到标题。侧重记一笔:上面创建的target_list肯定要放在循环里,否则每一帧获取到的目标物领会累加在内里,末了显现的图像和返回的坐标会像重影一样寻常给框出许多目标。而放入while循环里之后,每次循环都会重修一个target_list就相称于之前的给清零了。
回顾总结:到这里这个项目算是完成了,虽说是完成了,但是不敷完满,也不敷完善。告急的标题有:
1、只能辨认单一配景下的目标气球,如果是拿到室外等配景比力复杂的多物体环境中就难以准确辨认。
2、辨认准确度低,由于采取颜色辨认的方案,以是只要在颜色字典设置的阈值之内都会被认作是目标。
但是想要实现的根本功能都实现了,以是说还算拼集吧~
结果展示:

继续积极,继续加油!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x

帖子地址: 

回复

使用道具 举报

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

本版积分规则

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

  • 微信公众号

  • 商务合作