当前位置:   article > 正文

Python-opencv实现目标检测定位:判断固定颜色物体是否在规定区域内_opencv目标识别与定位

opencv目标识别与定位

一、简介

主要实现实时检测视频或者摄像头中出现的固定颜色(本例中使用绿色)是否在规定的区域范围内,并将结果反馈到原视频上。

二、效果

实现的效果如下图所示:

1、当绿色物体出现在屏幕中的黑框中时,在视频左上角反馈一个“True”的信息。

2、当绿色物体出现在屏幕中但没有完全出现在黑框中时,在视频左上角反馈一个“Flase”的信息。

3、当绿色物体没有出现在屏幕中时,不显示任何信息。

三、代码

运行环境:python 3.8.17      opencv 4.8.0

下面是完整代码:

  1. import numpy as np
  2. import cv2
  3. cap = cv2.VideoCapture("video.mp4") # 将"video.mp4"换为0,即可调用摄像头
  4. width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频的宽度
  5. height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频的高度
  6. print(width, height)
  7. # 下面是规定区域的位置设置
  8. w1 = 400
  9. h1 = 400
  10. x1 = int(width / 2 - w1 / 2)
  11. y1 = int(height / 2 - h1 / 2 - 100)
  12. # print(x1, y1, x1 + w1, y1 + h1)
  13. font = cv2.FONT_HERSHEY_SIMPLEX # 设置字体样式
  14. kernel = np.ones((5, 5), np.uint8) # 卷积核
  15. if cap.isOpened() is True: # 检查摄像头是否正常启动
  16. while True:
  17. ret, frame = cap.read()
  18. if not ret:
  19. break
  20. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转换为灰色通道
  21. hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 转换为HSV空间
  22. lower_green = np.array([35, 50, 100]) # 设定绿色的阈值下限
  23. upper_green = np.array([77, 255, 255]) # 设定绿色的阈值上限
  24. # 消除噪声
  25. mask = cv2.inRange(hsv, lower_green, upper_green) # 设定掩膜取值范围
  26. opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # 形态学开运算
  27. bilateral = cv2.bilateralFilter(mask, 10, 200, 200) # 双边滤波消除噪声
  28. edges = cv2.Canny(opening, 50, 100) # 边缘识别
  29. # 在原视频上跟踪目标绘制绿色矩形框
  30. contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  31. for contour in contours:
  32. x, y, w, h = cv2.boundingRect(contour) # 获取轮廓的边界框
  33. # print(x, y, w, h)
  34. cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) # 在原视频上绘制矩形框
  35. # 判断位置关系
  36. if x >= x1 and y >= y1 and x + w <= x1 + w1 and y + h <= y1 + h1:
  37. result = "True"
  38. else:
  39. result = "Flase"
  40. cv2.putText(frame, result, (10, 30), font, 1.0, (255, 0, 255), 2)
  41. # 在原视频上绘制限定区域框
  42. cv2.rectangle(frame, (x1, y1), (x1 + w1, y1 + h1), (0, 0, 0), 2) # frame要绘制的帧,四个坐标点,颜色,线宽
  43. cv2.imshow('edges', edges)
  44. cv2.imshow('frame', frame)
  45. k = cv2.waitKey(5) & 0xFF
  46. # 按Esc键退出
  47. if k == 27:
  48. break
  49. cap.release()
  50. cv2.destroyAllWindows()
  51. else:
  52. print('cap is not opened!')

可以将cv2.rectangle(frame, (x1, y1), (x1 + w1, y1 + h1), (0, 0, 0), 2)缩进,把固定区域框的颜色从黑色(0,0,0)换为变量color,与判定结果"True""Flase"关联,设为两种不同的颜色,即可只管看到区域之间的位置关系。

缺点:对噪声处理不完全,在分割边缘的时候会产生噪点。

参考自,侵删:OpenCV-Python——实现圆形检测与追踪_opencv打开摄像头检测圆的中心位置python_YukinoSiro的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/369921
推荐阅读
相关标签
  

闽ICP备14008679号