Python OpenCV 乒乓球视频提取 - 使用掩膜技术提取橙黄色圆形
使用 Python 和 OpenCV 从乒乓球视频中提取橙黄色圆形
本代码使用 Python 和 OpenCV 库,通过颜色掩膜技术从乒乓球视频中提取橙黄色圆形乒乓球,并将其单独显示。
代码:
import cv2
# 读入视频
cap = cv2.VideoCapture('C:/Users/Jionie/Desktop/dazuo/pp.mp4')
# 设置颜色范围
lower_color = (0, 100, 180)
upper_color = (20, 255, 255)
while True:
# 读取一帧
ret, frame = cap.read()
if not ret:
break
# 将图像转换为HSV格式
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 根据颜色范围创建掩膜
mask = cv2.inRange(hsv, lower_color, upper_color)
# 膨胀掩膜以填充空洞
mask = cv2.dilate(mask, None, iterations=2)
# 查找轮廓
contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 提取最大的轮廓
if len(contours) > 0:
c = max(contours, key=cv2.contourArea)
# 计算轮廓的最小外接圆
((x, y), radius) = cv2.minEnclosingCircle(c)
# 绘制圆形
cv2.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)
# 提取乒乓球图像
ball = frame[int(y-radius):int(y+radius), int(x-radius):int(x+radius)]
# 显示图像
cv2.imshow('frame', frame)
cv2.imshow('ball', ball)
# 按下q键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
代码解释:
- 读取视频: 使用
cv2.VideoCapture()函数打开视频文件。 - 设置颜色范围: 定义橙黄色乒乓球的颜色范围,使用 HSV 颜色空间。
lower_color和upper_color分别代表颜色范围的下限和上限。 - 循环遍历视频帧: 使用
while循环读取每帧视频。 - 转换为 HSV 格式: 使用
cv2.cvtColor()将 BGR 格式的视频帧转换为 HSV 格式。 - 创建掩膜: 使用
cv2.inRange()函数根据颜色范围创建掩膜,将符合颜色范围的像素设置为白色,其他像素设置为黑色。 - 膨胀掩膜: 使用
cv2.dilate()函数膨胀掩膜,填充空洞,使掩膜更完整。 - 查找轮廓: 使用
cv2.findContours()函数查找掩膜中的轮廓。 - 提取最大轮廓: 找到最大的轮廓,假设它对应乒乓球。
- 计算最小外接圆: 使用
cv2.minEnclosingCircle()函数计算轮廓的最小外接圆。 - 绘制圆形: 使用
cv2.circle()函数在视频帧上绘制圆形,以突出显示乒乓球的位置。 - 提取乒乓球图像: 使用切片操作从视频帧中提取乒乓球区域的图像。
- 显示图像: 使用
cv2.imshow()函数显示视频帧和乒乓球图像。
运行代码:
- 确保你已经安装了 OpenCV 库。
- 将视频文件
pp.mp4放置在C:/Users/Jionie/Desktop/dazuo目录下。 - 运行代码,观看视频和提取的乒乓球图像。
注意:
- 代码中的颜色范围
lower_color和upper_color是根据乒乓球的颜色进行设置的。如果你的视频中的乒乓球颜色有所不同,需要调整这些值。 - 如果你使用的是其他版本的 OpenCV,可能需要根据版本修改代码中的函数名或参数。
- 如果你需要提取多个乒乓球,需要修改代码以处理多个轮廓。
- 代码中的
cv2.waitKey(1)函数控制视频播放速度,你可以根据需要修改参数。 cv2.destroyAllWindows()函数用于关闭所有窗口,确保释放所有资源。
原文地址: https://www.cveoy.top/t/topic/nK7Y 著作权归作者所有。请勿转载和采集!