【问题标题】:OpenCV VideoWriter won't write anything, although cvWriteToAVI doesOpenCV VideoWriter 不会写任何东西,尽管 cvWriteToAVI 会
【发布时间】:2012-08-21 12:31:50
【问题描述】:

我一直在尝试从摄像头捕捉视频并将其写入 AVI 文件。我在 Windows 7 上使用带有 MSVC 2010 (x86) 的 Qt 4.8.2。我有两个版本的代码:一个使用 cv::Mat,另一个使用 IplImage*。但是,只有 IplImage* 版本有效。这是我使用 cv::Mat 的代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main() {
    VideoCapture* capture2 = new VideoCapture( CV_CAP_DSHOW );
    Size size2 = Size(640,480);
    int codec = CV_FOURCC('M', 'J', 'P', 'G');
    VideoWriter* writer2 = new VideoWriter("video.avi",codec,15,size2);

    int a = 100;
    Mat frame2;
    while ( a > 0 ) {
        capture2->read(frame2);
        writer2->write(frame2);
        a--;
    }

    writer2->release();
    capture2->release();
    return 0;
}

这是使用 IplImage* 的代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main() {
    CvCapture* capture = cvCaptureFromCAM( CV_CAP_DSHOW );
    CvSize size = cvSize(640,480);
    int codec = CV_FOURCC('M', 'J', 'P', 'G');
    CvVideoWriter* writer = cvCreateVideoWriter("video.avi",codec,15,size);

    int a = 100;
    while ( a > 0 ) {
        IplImage* frame = cvQueryFrame( capture );
        cvWriteToAVI(writer,frame);
        a--;
    }

    cvReleaseVideoWriter(&writer);
    cvReleaseCapture( &capture );
    return 0;
}

基本上是一样的,或者至少在我看来是一样的。它读取 100 帧并将它们写入“video.avi”。它编译运行没有错误,但是 cv::Mat 版本不写任何东西,IplImage* 版本完美运行。

有人知道发生了什么吗?

【问题讨论】:

    标签: opencv video-capture


    【解决方案1】:

    Opencv C++ 参考中的语法有点不同,这里是 C++ 中的工作代码。 我刚刚添加了 imshow 和 waitkey,用于检查您是否可以根据需要删除它们。

    int main()
    {
        VideoCapture* capture2 = new VideoCapture(CV_CAP_DSHOW);
        Size size2 = Size(640, 480);
        int codec = CV_FOURCC('M', 'J', 'P', 'G');
        // Unlike in C, here we use an object of the class VideoWriter//
        VideoWriter writer2("video_.avi", codec, 15.0, size2, true);
    
        writer2.open("video_.avi", codec, 15.0, size2, true);
        if (writer2.isOpened())
        {
            int a = 100;
            Mat frame2;
            while (a > 0)
            {
                capture2->read(frame2);
                imshow("live", frame2);
                waitKey(100);
                writer2.write(frame2);
                a--;
            }
        }
        else
        {
            cout << "ERROR while opening" << endl;
        }
    
        // No Need to release the Writer as the distructor will called automatically
        capture2->release();
    
        return 0;
    }
    

    【讨论】:

    • 以这种方式创建的任何文件的大小为 5.7 kB。似乎它只是写一些标题。不适合我。
    【解决方案2】:

    我一遍又一遍地遇到同样的问题,但我在网上找到的解决方案都没有帮助。

    很奇怪,问题(纯粹通过试错法确定)出在写入权限上。在我sudo chmod u+rwx python 脚本之后一切正常。

    【讨论】:

      【解决方案3】:

      我也有同样的问题,过了几次我意识到输入视频的大小与输出的大小不同。调整输入视频的大小可能会对您有所帮助。

       capture2->read(frame2);
       cv::resize(frame2,frame2,cv::Size(640,480);
       writer2->write(frame2);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多