我正在尝试编写一个程序,该程序采用 1920x1080 30fps 视频和具有 1080x3(对于 RGB 中的每个通道)的(随机)掩码,并返回一个视频,其中每个像素都由该掩码操作。
获取 input.mp4 并创建屏蔽版本的代码如下所示:
# init video_reader and video_writer:
video_caputure = cv2.VideoCapture("./videos/input.mp4")
frame_width = int(video_caputure.get(3))
frame_height = int(video_caputure.get(4))
frame_count = int(video_caputure.get(cv2.CAP_PROP_FRAME_COUNT))
video_writer = cv2.VideoWriter("./videos/output.mp4",
cv2.VideoWriter_fourcc(*"mp4v"), 30,
(frame_width, frame_height))
# convert input to output using mask:
with open("./masks/mask.pickle", "rb") as file:
mask = pickle.load(file)
bar = ShadyBar("Processing", max= frame_count)
while(video_caputure.isOpened()):
ret, frame = video_caputure.read()
if ret:
converted_frame = np.add(frame, mask, dtype=np.int16)
converted_frame = converted_frame % 256
converted_frame = converted_frame.astype(np.uint8)
video_writer.write(converted_frame)
bar.next()
else:
break
video_caputure.release()
video_writer.release()
应该移除这个面具的版本看起来像这样:
# convert output into restored with mask:
video_caputure = cv2.VideoCapture("./videos/output.mp4")
frame_width = int(video_caputure.get(3))
frame_height = int(video_caputure.get(4))
frame_count = int(video_caputure.get(cv2.CAP_PROP_FRAME_COUNT))
video_writer = cv2.VideoWriter("./videos/restored.mp4",
cv2.VideoWriter_fourcc(*"mp4v"), 30,
(frame_width, frame_height))
# convert input to output using mask:
with open("./masks/mask.pickle", "rb") as file:
mask = pickle.load(file)
bar = ShadyBar("Processing", max= frame_count)
while(video_caputure.isOpened()):
ret, frame = video_caputure.read()
if ret:
converted_frame = np.subtract(frame, mask, dtype=np.int16)
converted_frame[converted_frame < 0] += 255
converted_frame = converted_frame.astype(np.uint8)
video_writer.write(converted_frame)
bar.next()
else:
break
video_caputure.release()
video_writer.release()
在这里你可以看到原始图像、蒙版和重建图像:
原创:
蒙面:
重建:
如果我测试我的转换逻辑并一个接一个地直接应用它们,我会得到原始图像,所以我假设错误是由某些压缩引起的。