提问者:小点点

Python:用处理过的图像创建视频


我有一段视频,记录了一辆汽车的正视图。该文件是. mp4,我想处理单个图像,以便我可以提取更多的信息(对象,车道线等)。问题是,当我想创建一个视频处理的文件,我得到一个错误。以下是我到目前为止所做的:

  1. 用cv2打开视频。VideoCapture()-工作正常

以下是我使用的代码:

enter code here
def process_image(image):
    gray = functions.grayscale(image)
    blur_gray = functions.gaussian_blur(gray, 5)
    canny_blur = functions.canny(blur_gray, 100, 200)

    return canny_blur

process_on =0
count =0

video= cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10, (1600, 1200))

vidcap = cv2.VideoCapture('input.mp4')
success,image = vidcap.read()

success = True
while success:
  processed = process_image(image)
  video.write(processed)

这是我得到的错误:

OpenCV错误:断言失败(img.cols==宽度

我的建议是:由于RGB颜色字段,正常图像具有三维。处理后的图像只有一个维度。我如何调整这个在cv2。VideoWriter功能。

谢谢你的帮助


共2个答案

匿名用户

VideoWriter()类仅写入彩色图像,而不写入灰度图像,除非您在Windows上,这看起来可能是从输出中的路径判断的。在Windows上,您可以将可选参数isColor=0isColor=False传递给VideoWriter()构造函数以写入单通道图像。否则,简单的解决方案就是将灰度帧堆叠成一个三通道图像(您可以使用cv2.merge([gray,gray,gray])并编写它。

VideoWriter()文档:

参数:

isColor–如果它不是零,编码器将期望并编码颜色帧,否则它将处理灰度帧(该标志当前仅在Windows上受支持)。

因此,默认情况下,isColor=True和标志不能在非Windows系统上更改。所以简单地做:

video.write(cv2.merge([processed, processed, processed])

应该给你打个补丁。尽管Windows变体允许写入灰度帧,但为了实现平台独立性,最好使用第二种方法。

此外,正如Zindarod在下面的评论中提到的,这里的代码还存在许多其他可能的问题。我假设您已经粘贴了修改过的代码,而您实际上并没有在这里运行,或者您本来会修改的。。。如果是这种情况,请只发布最小的、完整的和可验证的代码示例。

首先也是最重要的是,循环没有结束条件,因此它是不确定的。其次,您正在对帧大小进行硬编码,但VideoWriter()并不是简单地将图像大小调整为该大小。您必须提供要传递到VideoWriter()的帧的大小。请在写入之前将帧大小调整为相同的大小,或者使用VideoCapture()设备中定义的帧大小创建VideoWriter(使用帧大小属性的.get()方法)。

此外,您只读取循环外的第一帧。也许这是有意为之,但如果你想处理视频的每一帧,你当然需要在循环中读取它们,处理它们,然后写入它们。

最后,您应该在代码中有一些更好的错误捕获。例如,请参阅OpenCV“视频入门”Python教程。保存视频部分有适当的制衡:在打开视频捕获设备时运行循环,只有当被正确读取时,才处理和写入帧;然后一旦它超出帧,. read()方法将返回False,这将允许您打破循环,然后关闭捕获和写入设备。请注意这里的顺序--即使您已经阅读了最后一帧,VideoCapture()设备仍将被打开,因此您需要通过检查帧的内容来关闭循环。

匿名用户

添加isColor=False参数到VideoWriter

调整VideoWriter以这种方式将解决问题。

代码:

video= cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10, (1600, 1200), isColor=False)