5

カムからビデオをキャプチャしてAVIファイルに書き込もうとしています。Windows7のMSVC2010(x86)でQt4.8.2を使用しています。コードには2つのバージョンがあります。1つはcv:: Matを使用し、もう1つは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*バージョンは完全に機能します。

誰かが何が起こっているのかについて何か考えがありますか?

4

3 に答える 3

8

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;
}
于 2012-08-21T17:23:24.190 に答える