从视频中读取的 cv2 帧不同于从重新创建的视频中读取的帧
cv2 frame read from video is different from frame read from recreated video
我需要从视频文件中读取帧并从这些帧创建新视频。然后我从新视频中读取帧,我需要这些帧与我从原始视频中读取的帧相同。
这就是我所做的(例如,我只用了一帧)-
从视频中读取帧:
vidcap = cv2.VideoCapture('video_name.mp4')
success,orig_frame = vidcap.read()
从此帧写入新视频:
size = (1920,1080)
vidWriter = cv2.VideoWriter('new_video.mp4', cv2.VideoWriter_fourcc(*'MP4V'), 25, size)
vidWriter.write(orig_frame)
vidWriter.release()
从new_video读取帧:
vidcap = cv2.VideoCapture('new_video.mp4')
success,new_frame = vidcap.read()
比较 orig_frame 和 new_frame 表明它们并不相同。
orig_frame:
new_frame:
如何从原始视频和新视频中获取相同的帧?
这对于 MP4 是不可能的,因为它们使用 有损 编码来写入视频数据。您将无法在两个视频之间获得精确的逐像素匹配。
但是,如果您想获得精确匹配,则需要使用 无损 编解码器。
这取决于您使用的系统来确定支持哪些编解码器,但远景是使用 PNG 编码将视频帧写入文件。
尝试:
size = (1920,1080)
vidWriter = cv2.VideoWriter('new_video.avi', cv2.VideoWriter_fourcc(*'png '), 25, size)
vidWriter.write(orig_frame)
vidWriter.release()
如果以上不满意,请尝试咨询:Lossless compression for video in opencv
如果我能提出建议,我会不会使用 OpenCV 来执行此操作,因为您无法控制输出比特率、颜色分布等。您可以更好地控制这使用 FFMPEG。请在此处查看 post,了解如何使用无损压缩复制视频:Lossless ffmpeg conversion/encoding
我需要从视频文件中读取帧并从这些帧创建新视频。然后我从新视频中读取帧,我需要这些帧与我从原始视频中读取的帧相同。
这就是我所做的(例如,我只用了一帧)-
从视频中读取帧:
vidcap = cv2.VideoCapture('video_name.mp4')
success,orig_frame = vidcap.read()
从此帧写入新视频:
size = (1920,1080)
vidWriter = cv2.VideoWriter('new_video.mp4', cv2.VideoWriter_fourcc(*'MP4V'), 25, size)
vidWriter.write(orig_frame)
vidWriter.release()
从new_video读取帧:
vidcap = cv2.VideoCapture('new_video.mp4')
success,new_frame = vidcap.read()
比较 orig_frame 和 new_frame 表明它们并不相同。
orig_frame:
new_frame:
如何从原始视频和新视频中获取相同的帧?
这对于 MP4 是不可能的,因为它们使用 有损 编码来写入视频数据。您将无法在两个视频之间获得精确的逐像素匹配。
但是,如果您想获得精确匹配,则需要使用 无损 编解码器。
这取决于您使用的系统来确定支持哪些编解码器,但远景是使用 PNG 编码将视频帧写入文件。
尝试:
size = (1920,1080)
vidWriter = cv2.VideoWriter('new_video.avi', cv2.VideoWriter_fourcc(*'png '), 25, size)
vidWriter.write(orig_frame)
vidWriter.release()
如果以上不满意,请尝试咨询:Lossless compression for video in opencv
如果我能提出建议,我会不会使用 OpenCV 来执行此操作,因为您无法控制输出比特率、颜色分布等。您可以更好地控制这使用 FFMPEG。请在此处查看 post,了解如何使用无损压缩复制视频:Lossless ffmpeg conversion/encoding