前言
【知识点】 视觉处理技术结合模式识别方法。
【素材准备】 准备视频A和视频B。 其中 视频A 是网上下载的风景区的视频录制(如张家界、武夷山或五大名山之一)。 视频B是个人在白墙或纯色背景前的行走视频。
【要求】 (i)通过阈值方法,结合OPENCV的与或运算,将视频B的个人影像(消除背景后)融入视频A,得到视频C。(50%)
一、代码实现
import os
import cv2
os.chdir('C:/Users/Bert/PycharmProjects/模式识别与计算机视觉/实验三/video/')
A_video = "A_1.mp4"
B_video = "B_2.mp4"
result_video = "A_migle_B.mp4"
cap_A = cv2.VideoCapture(A_video)
cap_B = cv2.VideoCapture(B_video)
fps_video_A = cap_A.get(cv2.CAP_PROP_FPS)
fps_video_B = cap_B.get(cv2.CAP_PROP_FPS)
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
width_A = int(cap_A.get(cv2.CAP_PROP_FRAME_WIDTH))
width_B = int(cap_B.get(cv2.CAP_PROP_FRAME_WIDTH))
height_A = int(cap_A.get(cv2.CAP_PROP_FRAME_HEIGHT))
height_B = int(cap_B.get(cv2.CAP_PROP_FRAME_HEIGHT))
roi_width = int((width_A - width_B) / 2)
roi_height = int((height_A - height_B) / 2)
videoWriter = cv2.VideoWriter(result_video, fourcc, fps_video_A, (width_A, height_A))
print("视频A的宽度:{} 视频A的高度:{} 视频A的帧率:{}".format(width_A, height_A, fps_video_A))
print("视频B的宽度:{} 视频B的高度:{} 视频的帧率:{}".format(width_B, height_B, fps_video_B))
while (cap_A.isOpened()):
ret_A, frame_A = cap_A.read()
ret_B, frame_B = cap_B.read()
if ret_A == True & ret_B == True:
rows, cols = frame_B.shape[:2]
roi = frame_A[roi_height:rows + roi_height, roi_width:cols + roi_width]
img2gray = cv2.cvtColor(frame_B, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 225, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
img2_fg = cv2.bitwise_and(frame_B, frame_B, mask=mask_inv)
dst = cv2.add(img1_bg, img2_fg)
frame_A[roi_height:rows + roi_height, roi_width:cols + roi_width] = dst
img_new_add = frame_A.copy()
videoWriter.write(img_new_add)
else:
break
cap_A.release()
cap_B.release()
videoWriter.release()
cv2.destroyAllWindows()
二、结果展示
原A_1.mp4:
原B_2.mp4:
A_migle_B.mp4:
三、建议
1.视频最终效果与视频B是个人在白墙或纯色背景前的行走视频有关,最好选取白色背景明显,整个人物明显区分于白色背景的视频,如面色,衣服等。
2.通过调节阈值也可以增强实验效果,具体代码在这一步:
ret, mask = cv2.threshold(img2gray, 215, 255, cv2.THRESH_BINARY)
该代码的解释为:将灰度图中灰度值小于215的点置0,灰度值大于215的点置255。因此可以改变代码中215数值来增强视频效果。 3.注意视频尺寸:背景视频尺寸一定要大于人物视频尺寸,无论长和宽。
|