实现对指定颜色的物体追踪主要分为以下几步:
- 使用OpenCV读取视频,并对读取的帧进行预处理,转换为HSV色彩空间。
import cv2
# 读取视频
cap = cv2.VideoCapture('test.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 转换为HSV色彩空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# TODO: 对hsv图像进行处理
- 定义颜色范围,用于后续追踪指定颜色的物体。
# 颜色范围
lower_color = (20, 100, 100)
upper_color = (30, 255, 255)
- 对预处理后的帧进行二值化,获取指定颜色的物体的掩码。
import numpy as np
# 二值化
mask = cv2.inRange(hsv, lower_color, upper_color)
# 腐蚀和膨胀操作,去掉噪声
kernel = np.ones((5, 5), np.uint8)
mask = cv2.erode(mask, kernel, iterations=2)
mask = cv2.dilate(mask, kernel, iterations=2)
- 使用轮廓检测对掩码进行处理,获取指定颜色的物体的外边界矩形框。
# 轮廓检测
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 筛选出最大轮廓
if len(contours) > 0:
max_contour = max(contours, key=cv2.contourArea)
# 获取轮廓的外接矩形框
x, y, w, h = cv2.boundingRect(max_contour)
# 画出矩形框
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
- 对每帧的处理结果进行展示。
# 展示结果
cv2.imshow('frame', frame)
# 按q键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
以下是两个示例:
示例一:追踪黄色球体
- 获取黄色颜色范围。
# 颜色范围
lower_yellow = (25, 80, 80)
upper_yellow = (35, 255, 255)
- 对预处理后的帧进行二值化。
# 二值化
mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
- 使用轮廓检测对掩码进行处理,获取黄色球体的外边界矩形框。
if len(contours) > 0:
max_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(max_contour)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
示例二:追踪红色人手
- 获取红色颜色范围。
# 颜色范围
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
mask1 = cv2.inRange(hsv, lower_red, upper_red)
lower_red = np.array([170, 50, 50])
upper_red = np.array([180, 255, 255])
mask2 = cv2.inRange(hsv, lower_red, upper_red)
mask = mask1 + mask2
- 对预处理后的帧进行二值化。
# 二值化
mask = mask1 + mask2
- 使用轮廓检测对掩码进行处理,获取红色人手的外边界矩形框。
if len(contours) > 0:
max_contour = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(max_contour)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:通过OpenCV实现对指定颜色的物体追踪 - Python技术站