首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:用处理过的图像创建视频

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

Stack Overflow用户
提问于 2017-10-02 13:10:20
回答 2查看 1.9K关注 0票数 1

我有一段录像,里面记录了一辆车的正面景色。该文件是一个.mp4,我想要处理单个图像,以便我可以提取更多的信息(对象,车道线等)。问题是,当我想要从处理过的文件中创建一个视频时,我会得到一个错误。以下是我迄今所做的工作:

  1. 用cv2打开视频。video ()- Works
  2. 用cv2.imwrite()保存视频的单个帧-工作正常
  3. 用cv2.用cv2创建一个由单个帧组成的视频,video ()-工作得很好
  4. 使用cv2.cvtColor()、cv2.GaussianBlur()和cv2.Canny()对视频进行后处理--工作正常
  5. 从处理过的图像中创建视频--不起作用。

下面是我使用的代码:

代码语言:javascript
运行
复制
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)

这是我得到的错误:

在cv::mjpeg::MotionJpegWriter::D:\Build\OpenCV\opencv-3.2.0\modules\videoio\src\cap_mjpeg_encoder.cpp,第834行回溯(最近一次调用)中的OpenCV错误:断言失败(img.cols == width & img.rows ==高度*3):文件"W:/Roborace/03_Information/10_Data/01_Montreal/camera/right_front_camera/01_Processed/Roborace_CAMERA_create_video.py",行30,在函数cv::mjpeg::MotionJpegWriter::D:\Build\OpenCV\opencv-3.2.0\modules\videoio\src\cap_mjpeg_encoder.cpp:834:中的video.write(处理)cv2.错误:video.write错误:(-215) img.cols ==宽度& img.rows ==高度*3

我的建议是:由于RGB-颜色字段的原因,正常图像有三维.处理后的图像只有一维。如何在cv2中调整这个函数。

谢谢你的帮忙

EN

回答 2

Stack Overflow用户

发布于 2017-10-02 13:13:50

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

来自文档

参数: isColor -如果不是零,编码器将期望并编码彩色帧,否则它将处理灰度帧(目前只支持该标志)。

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

代码语言:javascript
运行
复制
video.write(cv2.merge([processed, processed, processed])

应该帮你修补一下。尽管Windows变体允许编写灰度帧,但使用第二种方法实现平台无关可能更好。

此外,作为Zindarod在下面的评论中提到,这里的代码还有许多其他可能的问题。我假设您已经粘贴了修改过的代码,而您实际上并没有在这里运行,或者您可能已经修改了otherwise...if --就是这样,请只发布最小限度,代码示例。

首先,您的循环没有结束条件,所以它是不确定的。其次,您正在对帧大小进行硬编码,但VideoWriter()并不是简单地将图像大小调整到该大小。您必须提供要传递到VideoWriter()的帧的大小。在编写之前,可以将框架大小调整到相同的大小,以确保这样做,或者使用在VideoWriter设备中定义的框架大小来创建您的VideoCapture() (对于框架大小属性使用方法 )。

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

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

票数 3
EN

Stack Overflow用户

发布于 2020-05-09 16:17:39

isColor=False参数添加到VideoWriter

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

代码:

代码语言:javascript
运行
复制
video= cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10, (1600, 1200), isColor=False)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46526157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档