c++ - OpenCV 不保存视频

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

我正在使用以下代码从文件中读取视频,应用 canny edge 算法并将修改后的视频写入文件。代码编译并完美运行。但是,视频没有写!我完全糊涂了。请告诉我错误是什么。 根本没有创建文件!操作系统: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);
}

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

最佳答案

每当我在我的应用程序中遇到奇怪的行为时,我都会写一个 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 不处理音频。

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

关于c++ - OpenCV 不保存视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13323264/

相关文章:

windows-phone-7 - 向循环磁贴添加文本 (Windows Phone 8)

opencv - 裁剪瓶子的液体区域以进行处理

c++ - 一堆独特元素的容器

C++ - 如何在不使用全局变量的情况下从函数调用变量

c++ - 如何改进 cvMat 中的像素排序?

opencv - FaceDetect OpenCV示例代码不适用于MSV C++ 2008 v9

opencv - 我可以将 openCV 库与 Catapult C 一起使用吗?

c++ - qwt例子程序意外结束

javascript - AHK GUI DateTime 默认设置

python - 如何创建具有自定义起点和步长值的矩形网格