【问题标题】:OpenCV doesn't save the videoOpenCV 不保存视频
【发布时间】:2012-11-10 15:17:28
【问题描述】:

我正在使用以下代码从文件中读取视频,应用精明边缘算法并将修改后的视频写入文件。代码编译并完美运行。但是,视频没有写!我完全糊涂了。请告诉我错误是什么。 该文件根本没有创建!操作系统:Ubuntu 12.10

写入输出文件的代码

打开输出文件

bool setOutput(const std::string &filename, int codec=0, double framerate=0.0, bool isColor=true) {

    outputFile= filename;
    extension.clear();

    if (framerate==0.0) 
        framerate= getFrameRate(); // same as input

    char c[4];
    // use same codec as input
    if (codec==0) { 
        codec= getCodec(c);
    }

    // Open output video
    return writer.open(outputFile, // filename
    codec, // codec to be used 
    framerate,      // frame rate of the video
    getFrameSize(), // frame size
    isColor);       // color video?
}

编写框架

void writeNextFrame (Mat& frame)
{
    writer.write (frame);
}

还有一个单独的 run 方法来执行这些

【问题讨论】:

  • 输出文件大小是多少?它是否大于 0?文件是否被创建?
  • 文件未创建
  • 我也没有看到类似刷新输出并关闭流的地方
  • 它在行:return writer.open(outputFile, codec, framerate, getFrameSize(), isColor);
  • 发布您的整个程序不会帮助您获得答案。这个想法是只包括必要的部分。

标签: c++ opencv image-processing video-processing


【解决方案1】:

每当我在应用程序中遇到奇怪的行为时,我都会写一个short, self contained, correct (compilable), example 来帮助我了解发生了什么。

我写了下面的代码来说明你应该做什么。值得注意的是,它在我的 Mac OS X 上完美运行:

#include <cv.h>
#include <highgui.h>

#include <iostream>
#include <string>

int main(int argc, char* argv[])
{
    // Load input video
    cv::VideoCapture input_cap("Wildlife.avi");
    if (!input_cap.isOpened())
    {
        std::cout << "!!! Input video could not be opened" << std::endl;
        return -1;
    }

    // Setup output video
    cv::VideoWriter output_cap("output.avi",  
                               input_cap.get(CV_CAP_PROP_FOURCC),
                               input_cap.get(CV_CAP_PROP_FPS), 
                               cv::Size(input_cap.get(CV_CAP_PROP_FRAME_WIDTH), input_cap.get(CV_CAP_PROP_FRAME_HEIGHT)));

    if (!output_cap.isOpened())
    {
        std::cout << "!!! Output video could not be opened" << std::endl;
        return -1;
    }

    // Loop to read frames from the input capture and write it to the output capture
    cv::Mat frame;
    while (true)
    {       
        if (!input_cap.read(frame))             
            break;

        output_cap.write(frame);
    }

    // Release capture interfaces   
    input_cap.release();
    output_cap.release();

    return 0;
}

使用 FFmpeg 检查输入文件会显示 (ffmpeg -i Wildlife.avi):

Input #0, avi, from 'Wildlife.avi':
  Metadata:
    ISFT            : Lavf52.13.0
  Duration: 00:00:07.13, start: 0.000000, bitrate: 2401 kb/s
    Stream #0.0: Video: msmpeg4v2, yuv420p, 1280x720, PAR 1:1 DAR 16:9, 29.97 tbr, 29.97 tbn, 29.97 tbc
    Stream #0.1: Audio: mp3, 44100 Hz, 2 channels, s16, 96 kb/s

和输出:

Input #0, avi, from 'output.avi':
  Metadata:
    ISFT            : Lavf52.61.0
  Duration: 00:00:07.10, start: 0.000000, bitrate: 3896 kb/s
    Stream #0.0: Video: msmpeg4v2, yuv420p, 1280x720, 29.97 tbr, 29.97 tbn, 29.97 tbc

所以两个文件之间唯一的显着变化是 OpenCV 生成的输出没有音频流,这是正确的行为,因为 OpenCV 不处理音频。

确保您的用户具有在您运行应用程序的目录中读取/写入/执行的适当权限。此外,我在代码中添加的调试可能会帮助您找到与输入/输出捕获相关的问题。

【讨论】:

  • 出了点问题。我收到了错误!!! Output video can't be opened,谢天谢地你插入了它。所以我想这就是问题所在。而且,顺便说一句,我是唯一的用户,因此是管理员,这些文件位于主目录的 Documents 文件夹中
  • 发现问题。我在所有这些文件中都使用了一个 mov 文件,这就是它没有写入的原因。我使用了一个 avi 文件,它工作正常。如何使其与 mov 文件一起使用?我所有的测试视频都是mov格式。编辑:我试过 mp4,但还是不行
  • AVI/MOV/MP4 are just containers 并且 OpenCV 知道如何阅读它们。真正的问题是数据在这些容器(编解码器)中打包的格式。您的 .mov 文件可能正在使用 OpenCV 不支持的编解码器。使用第 3 方工具更改您的 .mov 文件之一的编解码器,然后重试。
  • 我的 .mov 文件是从 iPod 相机录制的,而 .mp4 文件是从我笔记本电脑的网络摄像头在 Windows 8 中录制的。它们是否使用了一些 OpenCV 不知道如何读取的专有编解码器?
  • 顺便说一句,输入文件已打开并读取(那里没有错误)。只有输出文件没有被打开(因此,没有被写入)。
【解决方案2】:

您的机器上是否安装了 FFMPEG 库?在 Linux 上 FFMPEG 用于编写视频;在 Windows 上使用 FFMPEG 或 VFW。通过命令检查

 ffmpeg -version

尝试安装其他库 sudo apt-get install libavformat-dev libswscale-dev.

通过调用 writer.open,您只需初始化或重新初始化视频编写器。您必须调用 void VideoWriter::write(const Mat& image) 才能将下一个视频帧写入文件。我希望这会奏效。

【讨论】:

  • ffmpeg 未安装。所以,我使用sudo apt-get install ffmpeg 安装了它。它仍然没有将其写入磁盘。虽然终端说Output #0, mp4, to 'videolala.mp4': Stream #0.0: Video: [0][0][0][0] / 0x0000, yuv420p, 720x480, q=2-31, 22118 kb/s, 90k tbn, 42 tbc。而ffmpeg -version 给出ffmpeg version 0.8.4-6:0.8.4-0ubuntu0.12.10.1, Copyright (c) 2000-2012 the Libav developers。它还说The program is deprecated
  • 是的 VideoWriter::write 在另一个函数中被调用。也添加了该代码
【解决方案3】:

我遇到了同样的问题,我将编解码器更改为 DIVX。现在视频以 .avi 和 .mp4 格式保存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 2020-09-24
    • 1970-01-01
    • 2018-11-26
    • 2020-07-09
    • 2023-01-19
    • 2019-05-27
    相关资源
    最近更新 更多