Python OpenCV 乒乓球检测与跟踪:从视频帧中提取遮罩并标注位置
使用 Python 和 OpenCV 检测乒乓球并标注位置
本代码示例使用 Python 和 OpenCV 库,从乒乓球视频中提取乒乓球的遮罩,并用矩形框标注其位置。
代码
import cv2
# 读入视频
cap = cv2.VideoCapture('乒乓.mp4')
# 创建BackgroundSubtractor对象
fgbg = cv2.createBackgroundSubtractorMOG2()
while True:
ret, frame = cap.read() # 读取一帧视频
if not ret:
break
# 进行前景提取
fgmask = fgbg.apply(frame)
# 去噪
fgmask = cv2.medianBlur(fgmask, 5)
# 二值化
ret, thresh = cv2.threshold(fgmask, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制矩形框标注乒乓球位置
for contour in contours:
area = cv2.contourArea(contour)
if area < 100:
continue
(x, y, w, h) = cv2.boundingRect(contour)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示处理后的视频帧
cv2.imshow('frame', frame)
# 按下q键退出程序
if cv2.waitKey(30) & 0xff == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
代码解释
- 导入 OpenCV 库:
import cv2 - 读取视频:
cap = cv2.VideoCapture('乒乓.mp4') - 创建背景减除器:
fgbg = cv2.createBackgroundSubtractorMOG2() - 循环读取视频帧:
- 使用
cap.read()读取视频帧 - 使用
fgbg.apply(frame)进行前景提取 - 使用
cv2.medianBlur(fgmask, 5)对前景提取结果进行去噪 - 使用
cv2.threshold(fgmask, 127, 255, cv2.THRESH_BINARY)对去噪后的结果进行二值化 - 使用
cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)查找轮廓
- 使用
- 标注乒乓球位置:
- 遍历所有轮廓
- 计算轮廓面积,去除面积小于 100 的轮廓
- 使用
cv2.boundingRect(contour)获取轮廓的矩形框 - 使用
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)在视频帧上绘制矩形框
- 显示处理后的视频帧:
cv2.imshow('frame', frame) - 退出程序: 当按下
q键时,使用cv2.waitKey(30) & 0xff == ord('q')退出程序 - 释放资源: 使用
cap.release()释放视频捕获对象,使用cv2.destroyAllWindows()关闭所有窗口。
运行结果
运行代码后,将看到视频帧中乒乓球的位置被矩形框标注出来。
总结
本代码示例展示了使用 Python 和 OpenCV 库从视频帧中提取乒乓球的遮罩,并用矩形框标注其位置。代码中涉及了背景减除、去噪、二值化和轮廓提取等步骤,并使用循环处理每一帧视频。通过这些步骤,可以有效地检测和跟踪视频中的乒乓球。
原文地址: https://www.cveoy.top/t/topic/nK68 著作权归作者所有。请勿转载和采集!