Python:从处理后的图像中创建视频

标签 python opencv video

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

  • 使用 cv2.VideoCapture() 打开视频 - 工作正常
  • 使用 cv2.imwrite() 保存视频的单帧 - 工作正常
  • 使用 cv2.VideoWriter() 从单帧创建视频 - 工作正常
  • 使用 cv2.cvtColor()、cv2.GaussianBlur() 和 cv2.Canny() 对视频进行后处理 - 工作正常
  • 从处理后的图像中创建视频 - 不起作用。

  • 这是我使用的代码:
    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 Error: Assertion failed (img.cols == width && img.rows == height*3) in cv::mjpeg::MotionJpegWriter::write, file D:\Build\OpenCV\opencv-3.2.0\modules\videoio\src\cap_mjpeg_encoder.cpp, line 834 Traceback (most recent call last): File "W:/Roborace/03_Information/10_Data/01_Montreal/camera/right_front_camera/01_Processed/Roborace_CAMERA_create_video.py", line 30, in video.write(processed) cv2.error: D:\Build\OpenCV\opencv-3.2.0\modules\videoio\src\cap_mjpeg_encoder.cpp:834: error: (-215) img.cols == width && img.rows == height*3 in function cv::mjpeg::MotionJpegWriter::write



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

    谢谢你的帮助

    最佳答案

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

    来自 VideoWriter() docs :

    Parameters:

    isColor – If it is not zero, the encoder will expect and encode color frames, otherwise it will work with grayscale frames (the flag is currently supported on Windows only).



    所以默认情况下,isColor=True并且标志不能在非 Windows 系统上更改。所以简单地做:
    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()即使您已阅读最后一帧,设备仍将“打开”,因此您需要通过检查帧的内容来关闭循环。

    关于Python:从处理后的图像中创建视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46526157/

    相关文章:

    python - 将 opengl 缓冲区写入视频的工件

    ios - 移动设备上的 HTML5 媒体捕获 - 视频时长

    python - 在 Python 中附加到二维列表

    c++ - OpenCV:如何创建多边形的 mask ?

    python - 将嵌套字典中列表的元素加在一起 ​​- python

    Python - 将多个相同维度的二维数组合并为一个二维数组

    eclipse - 加载共享库时出错 : libopencv_core. so.3.1

    video - 通过 API 限制 YouTube 视频访问

    python - 用于捕获重复模式的正则表达式

    python - Python中的曲线拟合指数增长函数