首页 文章

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

提问于
浏览
0

我有一个录制汽车前视图的视频 . 该文件是.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错误:在cv :: mjpeg :: MotionJpegWriter :: write中,断言失败(img.cols == width && img.rows == height * 3),文件D:\ Build \ OpenCV \ opencv-3.2.0 \ modules \ videoio \ src \ cap_mjpeg_encoder.cpp,第834行回溯(最近一次调用最后一次):文件“W:/Roborace/03_Information/10_Data/01_Montreal/camera/right_front_camera/01_Processed/Roborace_CAMERA_create_video.py”,第30行,在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 ==函数cv :: mjpeg :: MotionJpegWriter :: write中的高度* 3

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

谢谢你的帮助

1 回答

  • 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,您的代码还存在许多其他可能的问题 . 我_878618_已经粘贴了修改后的代码,你不是't actually running here, or that you would have modified otherwise...if that'的情况,请只发贴minimal, complete, and verifiable代码示例 .

    首先,你的循环没有结束条件,所以's indefinite. Secondly, you'重新编码帧大小,但 VideoWriter() 并不简单地将图像大小调整为该大小 . 您必须提供要传递到 VideoWriter() 的帧的大小 . 在写入之前将帧大小调整为相同大小以确保,或者使用 VideoCapture() 设备中定义的帧大小创建 VideoWriter (使用.get() methods作为帧大小属性) .

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

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

相关问题