读取隔行扫描视频时的梳理效果

Combing effect while reading interlaced video

全部。我有一个非常奇怪的问题,阅读 OpenCV 中的 VideoCapture。 我有 .MTS 视频 (MPEG2),我使用下一个代码在 OpenCV 中读取它们:



cv2.namedWindow("frame", cv2.WINDOW_NORMAL)

cap = cv2.VideoCapture("00030.MTS")

while(cap.isOpened()):
    ret,frame = cap.read()
    cv2.imshow("frame", frame)
    cv2.waitKey(0)

这显示了损坏的帧(上面有条带)。如果我将帧保存为图像,并在 OpenCV 之外查看它,则会保持相同的质量。

但它应该是这样的: 我以前在使用 .avi 或 .mp4

时从未见过这种情况

如何获得与媒体播放器相同的未损坏帧?

(我编辑了问题的标题。其中一些信息最初并不明显。)

您的文件名表明此视频 material 是摄像机自己录制的,没有任何改动。

您的视频似乎是“隔行扫描”的,即不是“逐行扫描”的。隔行扫描视频由“场”而不是完整的帧组成。一个字段包含图像的所有偶数或奇数 。偶数场和奇数场相互跟随。使用这种方法,您可以获得以 50 Hz 更新的“50i”视频,但只需要完整“50p”视频的一半数据(一半数据意味着垂直分辨率降低)。

OpenCV(可能)使用 ffmpeg 读取您的视频文件。

ffmpeg 和 VLC 都知道视频文件何时包含隔行扫描视频数据。 VLC 会自动应用合适的过滤器,使这些数据更易于查看。 ffmpeg 不会,因为过滤会花费处理时间并更改数据。

您应该使用 ffmpeg 来“de-interlace”您的视频文件。我建议 yadif filter.

示例:

ffmpeg -i 00001.MTS -c copy -vf yadif -c:v libx264 -b:v 24M 00001_deinterlaced.MTS

你应该看看settings/options of yadif。也许默认值不符合您的喜好。尝试 yadif=1 获取 field-rate 渐进式视频 (50/60p)。