以下代码使用 Python 和 OpenCV 库,从视频中提取橙黄色乒乓球的遮罩,并将它投屏在黑色背景的视频中,生成以乒乓球为主体的视频。

import cv2
import numpy as np

# 读入视频
cap = cv2.VideoCapture('C:/Users/Jionie/Desktop/dazuo/pp.mp4')

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

# 定义输出视频的宽度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 定义输出视频的帧率和编码方式
fps = cap.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

# 创建输出视频对象
out = cv2.VideoWriter('C:/Users/Jionie/Desktop/dazuo/pp_output.mp4', fourcc, fps, (width, height))

while True:
    # 读取一帧视频
    ret, frame = cap.read()
    if not ret:
        break
    
    # 将当前帧转换为HSV颜色空间
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    
    # 使用inRange函数获取橙黄色的遮罩
    mask = cv2.inRange(hsv, lower_orange, upper_orange)
    
    # 使用HoughCircles函数检测圆形轮廓
    circles = cv2.HoughCircles(mask, cv2.HOUGH_GRADIENT, dp=1, minDist=50, param1=100, param2=30, minRadius=10, maxRadius=50)
    
    # 如果检测到圆形轮廓,则将圆形轮廓绘制在原始图像上,并将其投屏在黑色背景的视频中
    if circles is not None:
        circles = np.uint16(np.around(circles))
        for i in circles[0,:]:
            x, y, r = i
            cv2.circle(frame, (x, y), r, (0, 255, 0), 2)
            mask = np.zeros((height, width), dtype=np.uint8)
            cv2.circle(mask, (x, y), r, 255, -1)
            output = np.zeros(frame.shape, dtype=np.uint8)
            output[mask>0] = frame[mask>0]
            out.write(output)
    
    # 显示当前帧的画面
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == ord('q'):
        break

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

代码解析:

  1. 读入视频: 使用 cv2.VideoCapture 函数读入指定路径的视频文件。
  2. 定义颜色范围: 使用 np.array 定义橙黄色的 HSV 颜色范围,以便后续使用 cv2.inRange 函数提取遮罩。
  3. 获取视频尺寸和帧率: 使用 cap.get 函数获取视频的宽度、高度、帧率和编码方式。
  4. 创建输出视频对象: 使用 cv2.VideoWriter 函数创建输出视频对象,指定输出视频的路径、编码方式、帧率和尺寸。
  5. 循环处理视频帧: 循环读取视频帧,并对每一帧进行以下操作:
    • 将当前帧转换为 HSV 颜色空间。
    • 使用 cv2.inRange 函数提取橙黄色的遮罩。
    • 使用 cv2.HoughCircles 函数检测圆形轮廓。
    • 如果检测到圆形轮廓,则将圆形轮廓绘制在原始图像上,并使用遮罩提取乒乓球区域,将该区域投屏到黑色背景的视频中,并写入输出视频对象。
  6. 显示当前帧: 使用 cv2.imshow 函数显示当前帧的画面。
  7. 释放资源: 使用 cap.release()out.release()cv2.destroyAllWindows() 函数释放资源。

总结:

这段代码利用 OpenCV 库中的图像处理函数,实现了从乒乓球视频中提取橙黄色乒乓球的遮罩,并将其投屏在黑色背景的视频中,生成以乒乓球为主体的视频。

Python OpenCV 乒乓球遮罩提取与投屏

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

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