Python OpenCV 乒乓球提取及投屏:基于掩码技术的视频处理
以下 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()
代码解释:
- 首先定义了橙黄色HSV值范围,用于提取乒乓球的遮罩。
- 定义了黑色背景,用于将提取出的乒乓球投屏到黑色背景的视频中。
- 打开视频文件,获取视频帧率、宽度、高度。
- 打开视频写入器,用于将投屏后的视频帧写入到文件中。
- 循环读取视频帧,对每一帧进行处理。
- 将视频帧转换为HSV颜色空间,提取出乒乓球的遮罩。
- 通过遮罩提取出乒乓球,将乒乓球画在原视频帧和黑色背景上。
- 显示视频帧和遮罩。
- 将投屏后的视频帧写入到文件中。
- 按q键退出循环。
- 释放资源。
原文地址: https://www.cveoy.top/t/topic/nK76 著作权归作者所有。请勿转载和采集!