已解决
[python opencv video抠图并更换背景]
来自网友在路上 179879提问 提问时间:2023-09-20 05:26:22阅读次数: 79
最佳答案 问答题库798位专家为你答疑解惑
完整实现
- 可以对前景进行缩放
- 可以对前景进行平移
import cv2
import numpy as npdef adjust_img(img, position_params, size_rate):"""调整图像必须先缩小-再平移:param img::param position_params::param size_rate::return:"""h, w = img.shape[:2]# 进行缩放new_size = [int(size_rate * h), int(size_rate * w)]img = cv2.resize(img, (new_size[1], new_size[0]))if w >= new_size[1]:pad_w = w - new_size[1]pad_h = h - new_size[0]top, bottom = pad_h // 2, pad_h - (pad_h // 2)left, right = pad_w // 2, pad_w - (pad_w // 2)img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT,None,(0, 0, 0))else:crop_w = (new_size[1] - w) // 2crop_h = (new_size[0] - h) // 2img = img[crop_h:crop_h + h, crop_w:crop_w + w]# 进行平移MAT = np.float32([[1, 0, int(w * position_params[1])], [0, 1, int(h * position_params[0])]]) # 构造平移变换矩阵img = cv2.warpAffine(img, MAT, (w, h), borderValue=(0, 0, 0)) # 设置白色填充return imgdef video_compositing(video_root, mask_root, output_path, background_root, position_params,size_rate):""":param video_root::param mask_root: mask path:param output_path: 输出位置:param background_root: 背景图像path:param position_params: [0.5, 0.5], [垂直,水平]控制人像在图像中的位置, 计算例如:水平移动像素数/水平像素总数:param size_rate: 控制缩放大小,1:原始大小:return:"""video = cv2.VideoCapture(video_root)mask = cv2.VideoCapture(mask_root)if not video.isOpened():print(f"Failed to open video file: {video_root}")returnif not mask.isOpened():print(f"Failed to open mask file: {mask_root}")returnrval, frame = video.read()rval_mask, frame_mask = mask.read()fps = video.get(cv2.CAP_PROP_FPS)h, w = frame.shape[:2]fourcc = cv2.VideoWriter_fourcc(*'mp4v')video_writer = cv2.VideoWriter(output_path, fourcc, fps, (w, h))num_frame = video.get(cv2.CAP_PROP_FRAME_COUNT)# 是否加背景if background_root:background = cv2.imread(background_root)background = cv2.resize(background, (w, h))else:background = Nonefor c in range(int(num_frame)):if (frame is None) or (frame_mask is None):continue# 计算前景foreground = frame * (frame_mask / 255)foreground = adjust_img(foreground, position_params, size_rate)# 是否加背景if background_root:frame_mask = adjust_img(frame_mask, position_params, size_rate)fg_com = foreground + background * (1 - frame_mask / 255)else:fg_com = foregroundvideo_writer.write(fg_com.astype(np.uint8))rval, frame = video.read()rval_mask, frame_mask = mask.read()video_writer.release()
运行测试
video_compositing('data/video.mp4','data/mask.mp4','data/results.mp4','data/img.jpg',position_params=[0., 0.3], # 垂直,水平size_rate=1.8
)
查看全文
99%的人还看了
相似问题
- WPF 控件的缩放和移动
- 特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)
- 【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能
- FPGA高端项目:图像缩放+GTP+UDP架构,高速接口以太网视频传输,提供2套工程源码加QT上位机源码和技术支持
- uniapp 关于 video 组件的缩放比例问题
- flutter开发实战-图片缩放裁剪框图片裁剪功能
- winfrom窗体比例缩放
- idea设置字体大小快捷键 Ctrl+鼠标上下滑 字体快捷键缩放设置
- scss使用自定义函数实现单位像素随屏幕比例动态缩放
- Python入门教程50:Pycharm中鼠标滚动,如何实现字体大小自由的缩放
猜你感兴趣
版权申明
本文"[python opencv video抠图并更换背景]":http://eshow365.cn/6-9797-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!