以下 Python 代码使用 OpenCV 库,通过掩码技术从乒乓球视频中提取橙黄色的乒乓球,并将其投屏到黑色背景上。

import cv2
import numpy as np

# 定义橙黄色HSV值范围
lower_orange = np.array([11, 43, 46])
upper_orange = np.array([25, 255, 255])

# 定义黑色背景
black_bg = np.zeros((480, 640, 3), dtype=np.uint8)

# 打开视频文件
cap = cv2.VideoCapture('C:/Users/Jionie/Desktop/dazuo/pp.mp4')

# 获取视频帧率、宽度、高度
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 打开视频写入器
out = cv2.VideoWriter('C:/Users/Jionie/Desktop/dazuo/pp_mask.mp4', cv2.VideoWriter_fourcc(*'XVID'), fps, (width, height))

while True:
    # 读取视频帧
    ret, frame = cap.read()
    if not ret:
        break

    # 转换颜色空间为HSV
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 获取橙黄色遮罩
    mask = cv2.inRange(hsv, lower_orange, upper_orange)

    # 提取乒乓球
    contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area > 100:
            (x, y), r = cv2.minEnclosingCircle(cnt)
            center = (int(x), int(y))
            radius = int(r)
            cv2.circle(frame, center, radius, (0, 255, 0), 2)
            cv2.circle(black_bg, center, radius, (0, 255, 0), -1)
    
    # 显示视频帧
    cv2.imshow('frame', frame)
    cv2.imshow('mask', mask)

    # 写入视频帧
    out.write(black_bg)

    # 按q键退出
    if cv2.waitKey(1) == ord('q'):
        break

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

代码解释:

  1. 首先定义了橙黄色HSV值范围,用于提取乒乓球的遮罩。
  2. 定义了黑色背景,用于将提取出的乒乓球投屏到黑色背景的视频中。
  3. 打开视频文件,获取视频帧率、宽度、高度。
  4. 打开视频写入器,用于将投屏后的视频帧写入到文件中。
  5. 循环读取视频帧,对每一帧进行处理。
  6. 将视频帧转换为HSV颜色空间,提取出乒乓球的遮罩。
  7. 通过遮罩提取出乒乓球,将乒乓球画在原视频帧和黑色背景上。
  8. 显示视频帧和遮罩。
  9. 将投屏后的视频帧写入到文件中。
  10. 按q键退出循环。
  11. 释放资源。
Python OpenCV 乒乓球提取及投屏:基于掩码技术的视频处理

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

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