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

时间:2017-10-02 13:10:21

标签: python opencv video

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

  1. 使用cv2.VideoCapture()打开视频 - 正常工作
  2. 使用cv2.imwrite()保存视频的单帧 - 正常工作
  3. 使用cv2.VideoWriter()创建单帧视频 - 正常工作
  4. 使用cv2.cvtColor(),cv2.GaussianBlur()和cv2.Canny()对视频进行后处理 - 工作正常
  5. 从已处理的图片中创建视频 - 不起作用。
  6. 以下是我使用的代码:

    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 == width&& img.rows == height * 3)在cv :: mjpeg :: MotionJpegWriter :: write,文件D:\ Build \ OpenCV \ opencv- 3.2.0 \ modules \ videoio \ src \ cap_mjpeg_encoder.cpp,第834行   Traceback(最近一次调用最后一次):     文件“W:/Roborace/03_Information/10_Data/01_Montreal/camera/right_front_camera/01_Processed/Roborace_CAMERA_create_video.py”,第30行,in       video.write(处理过的)   cv2.error:D:\ Build \ OpenCV \ opencv-3.2.0 \ modules \ videoio \ src \ cap_mjpeg_encoder.cpp:834:错误:(-215)img.cols == width&& img.rows == height * 3 in function cv :: mjpeg :: MotionJpegWriter :: write

    我的建议是:由于RGB色场,正常图像有3个维度。处理后的图像只有一个维度。我如何在cv2.VideoWriter函数中调整它。

    感谢您的帮助

2 个答案:

答案 0 :(得分:2)

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

来自VideoWriter() docs

  

参数:

     

isColor - 如果它不为零,编码器将对彩色帧进行预期和编码,否则它将与灰度帧一起使用(该标志目前仅在Windows上受支持)。

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

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

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

同样Zindarod mentions in the comments below,您的代码还存在许多其他问题。我假设您已经粘贴了您实际上并未在此处运行的修改后的代码,或者您将修改其他内容...如果是这种情况,请仅发布minimal, complete, and verifiable代码示例。

首先,你的循环没有结束条件,所以它是无限期的。其次,您正在对帧大小进行硬编码,但VideoWriter()并不是简单地将图像大小调整为该大小。您必须提供要传递到VideoWriter()的框架的大小。在写入之前将帧大小调整为相同大小,或者使用VideoWriter设备中定义的帧大小创建VideoCapture()(使用.get() methods作为帧大小属性)

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

最后,您应该在代码中捕获更好的错误。例如,请参阅OpenCV "Getting Started with Video" Python tutorial。 “保存视频”部分具有正确的检查和平衡:运行视频捕获设备打开的循环while,并且只有在frame被正确读取时才处理和写入帧;然后,一旦它超出帧,.read()方法将返回False,这将允许您突破循环,然后关闭捕获和编写器设备。请注意这里的排序--- VideoCapture()设备即使在您读完最后一帧时仍然会“打开”,因此您需要通过检查帧的内容来关闭循环。

答案 1 :(得分:0)

isColor=False参数添加到VideoWriter

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

代码:

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