Python OpenCV 乒乓球遮罩提取与投屏
以下代码使用 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()
代码解析:
- 读入视频: 使用
cv2.VideoCapture函数读入指定路径的视频文件。 - 定义颜色范围: 使用
np.array定义橙黄色的 HSV 颜色范围,以便后续使用cv2.inRange函数提取遮罩。 - 获取视频尺寸和帧率: 使用
cap.get函数获取视频的宽度、高度、帧率和编码方式。 - 创建输出视频对象: 使用
cv2.VideoWriter函数创建输出视频对象,指定输出视频的路径、编码方式、帧率和尺寸。 - 循环处理视频帧: 循环读取视频帧,并对每一帧进行以下操作:
- 将当前帧转换为 HSV 颜色空间。
- 使用
cv2.inRange函数提取橙黄色的遮罩。 - 使用
cv2.HoughCircles函数检测圆形轮廓。 - 如果检测到圆形轮廓,则将圆形轮廓绘制在原始图像上,并使用遮罩提取乒乓球区域,将该区域投屏到黑色背景的视频中,并写入输出视频对象。
- 显示当前帧: 使用
cv2.imshow函数显示当前帧的画面。 - 释放资源: 使用
cap.release()、out.release()和cv2.destroyAllWindows()函数释放资源。
总结:
这段代码利用 OpenCV 库中的图像处理函数,实现了从乒乓球视频中提取橙黄色乒乓球的遮罩,并将其投屏在黑色背景的视频中,生成以乒乓球为主体的视频。
原文地址: https://www.cveoy.top/t/topic/nK8f 著作权归作者所有。请勿转载和采集!