使用 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()

代码解释

  1. 导入 OpenCV 库: import cv2
  2. 读取视频: cap = cv2.VideoCapture('乒乓.mp4')
  3. 创建背景减除器: fgbg = cv2.createBackgroundSubtractorMOG2()
  4. 循环读取视频帧:
    • 使用 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) 查找轮廓
  5. 标注乒乓球位置:
    • 遍历所有轮廓
    • 计算轮廓面积,去除面积小于 100 的轮廓
    • 使用 cv2.boundingRect(contour) 获取轮廓的矩形框
    • 使用 cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) 在视频帧上绘制矩形框
  6. 显示处理后的视频帧: cv2.imshow('frame', frame)
  7. 退出程序: 当按下 q 键时,使用 cv2.waitKey(30) & 0xff == ord('q') 退出程序
  8. 释放资源: 使用 cap.release() 释放视频捕获对象,使用 cv2.destroyAllWindows() 关闭所有窗口。

运行结果

运行代码后,将看到视频帧中乒乓球的位置被矩形框标注出来。

总结

本代码示例展示了使用 Python 和 OpenCV 库从视频帧中提取乒乓球的遮罩,并用矩形框标注其位置。代码中涉及了背景减除、去噪、二值化和轮廓提取等步骤,并使用循环处理每一帧视频。通过这些步骤,可以有效地检测和跟踪视频中的乒乓球。

Python OpenCV 乒乓球检测与跟踪:从视频帧中提取遮罩并标注位置

原文地址: https://www.cveoy.top/t/topic/nK68 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录