写一段python代码运用mask处理技术用opencv 读入给定的乒乓mp4文件地址为CUsersJionieDesktopdazuoppmp4 编写代码分析每帧视频从视频画面中提取出一个乒乓球橙黄色圆形的遮罩然后再提取出乒乓球橙黄色圆形要求提取出的画面为以乒乓球橙黄色圆形为主体的图像投屏在一个黑色背景的视频中
以下是python代码:
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键退出循环。
- 释放资源
原文地址: http://www.cveoy.top/t/topic/dQji 著作权归作者所有。请勿转载和采集!