使用opencv将视频写入文件时遇到问题

Posted

技术标签:

【中文标题】使用opencv将视频写入文件时遇到问题【英文标题】:Trouble writing video to file using opencv 【发布时间】:2015-10-31 00:21:57 【问题描述】:

我正在尝试使用 Visualstudio 2013 中的 C++ 中的 OpenCV 将捕获的视频写入文件。程序似乎从我笔记本电脑上的网络摄像头捕获视频,并且还能够将每个帧保存为图像,但是当我将帧写入一个视频文件,我最终得到一个 6kb 的文件。程序没有给我任何错误,因为我已按照 OpenCV 文档中的说明进行操作。

我正在粘贴程序以供审核。请建议我如何使它成为一个成功的计划。

谢谢。

#include <stdio.h>
#include <iostream>
#include "opencv2\core\core.hpp"
#include "opencv2\highgui\highgui.hpp"

using namespace std;
using namespace cv;

int main()

    VideoCapture video_capture(0);

    if (!video_capture.isOpened())
    
        cout << "Error in opening video feed!" << endl;
        getchar();
        return -1;
    

    // Creating the window to view video feed
    String window_name = "Video_Feed";
    namedWindow(window_name, CV_WINDOW_AUTOSIZE);

    //
    Mat frame;

    // Filename
    String filename = "...\\first_recording.avi";

    // four character code
    int fcc = CV_FOURCC('M', 'P', '4', '2');

    // frames per sec
    int fps = 10;

    // frame size
    Size frame_size(CV_CAP_PROP_FRAME_WIDTH, CV_CAP_PROP_FRAME_HEIGHT);

    VideoWriter video_writer = VideoWriter(filename,fcc,fps,frame_size,true);

    if (!video_writer.isOpened())// || video_writer.isOpened == NULL)
    
        cout << "Error in opening video writer feed!" << endl;
        getchar();
        return -1;
    

    int frame_count = 0;

    while (frame_count < 100)
    
        bool cap_success = video_capture.read(frame);

        if (!cap_success)
        
            cout << "Error in capturing the image from the camera feed!" << endl;
            getchar();
            break;
        

        imshow(window_name, frame);
        //imwrite("cap.jpg", frame);
        video_writer.write(frame);

        switch (waitKey(10))
        
        case 27:
            return 0;
            break;
        
        frame_count++;
    

    //scvReleaseVideoWriter;
    destroyWindow(window_name);
    return 0;


【问题讨论】:

可能的原因 - 库没有看到编解码器。尝试另一个 FourCC,例如“MJPG”。检查 FFMPEG 库是否可用(没有必要,但有时它们提供了更多可能性) 我不知道如何检查FFMPEG,请你解释一下。 我正在使用静态构建 - avcodec、libav 等 dll。我不知道你是否可以在 Visual Studio 中使用 .lib 文件或 dll。 谢谢。当我阅读更多关于 FFMPEG 的内容时,我正在逐行浏览程序,发现我对帧大小的声明只给了我 3X4 像素导致错误。当我手动更改尺寸以匹配相机拍摄的图像尺寸时,我可以毫无问题地进行编程。 【参考方案1】:

请找到下面的代码来编写视频文件。

 int main(int argc, char* argv[])
    
        // Load input video
        cv::VideoCapture input_cap("test8.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;

【讨论】:

感谢您的建议,Arjun。当我手动更改帧的大小时,我能够录制电影。 @Abhi 如果对您有帮助,请接受答案。

以上是关于使用opencv将视频写入文件时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Python OpenCV 将摄像头/视频写入视频文件

OpenCV入门(C++/Python)- 使用OpenCV读取和编写视频

二.使用 OpenCV 读写视频

opencv-写入AVI视频文件

利用OpenCV读取和写入视频

每次我捕获视频并将其写入文件时如何给出不同的文件名? [关闭]