3

opencvを初めて使用しますが、ビデオファイルに書き込むときに問題が発生します。基本的に、私はHD Webカメラから読み取り、aviに書き込みます。実行可能なコード:

#include "cv.h"
#include "highgui.h"
int main(int argc, char** argv){
    CvCapture* capture=NULL;
    capture=cvCreateCameraCapture(0);
    if(!capture){
            return -1; 
    }   
    IplImage *bgr_frame=cvQueryFrame(capture);
    double fps=cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
    CvSize size=cvSize((int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),
                            (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));        
CvVideoWriter* writer=cvCreateVideoWriter(argv[1],
                                            CV_FOURCC('M','J','P','G'),
                                            fps,
                                            size);
    cvNamedWindow("Video", CV_WINDOW_AUTOSIZE); 
    while((bgr_frame=cvQueryFrame(capture))){
            cvWriteFrame(writer, bgr_frame);
            cvShowImage("Video", bgr_frame);
            char c=cvWaitKey(60);
            if(c==27){
                    break;
            }           
    }           
    cvReleaseVideoWriter(&writer);
    cvReleaseImage(&bgr_frame);
    cvReleaseCapture(&capture);
    return 0;
}

実行するとエラーが発生します

Output #0, avi, to 'test.avi':
Stream #0.0: Video: mjpeg, yuvj420p, 1280x720, q=2-31, 117964 kb/s, 90k tbn
[mjpeg @ 0x7fd55b805600] bitrate tolerance too small for bitrate
WARNING: Could not create empty movie file container.
OpenCV Error: Assertion failed (dst.data == dst0.data) in cvCvtColor, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_graphics_opencv/opencv/work/OpenCV-2.3.1/modules/imgproc/src/color.cpp, line 3175
terminate called throwing an exceptionAbort trap: 6

カメラはMacbookのHDウェブカメラです。問題を引き起こしているのはそのカメラですか?もしそうなら、ビットレートの許容範囲を低く設定できますか?私はopencvを初めて使用します。ありがとう!

ちなみに、argv [1] .aviが存在しない場合、CvVideoWriterは新しいファイルを作成できますか?

4

1 に答える 1

2

はい、cvCreateVideoWriterは、まだ存在しない場合に新しいファイルを作成します。

また、FPS検出コードがすべてのWebカメラドライバーに実装されているわけではないため、問題が発生します。1つのアサーションを追加してMacでコードを試しました。

double fps=(double)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
assert(fps>0.0);

そしてそれを実行します:

./w x.avi
Assertion failed: (fps>0.0), function main, file w.cpp, line 11.
Abort trap: 6

FPSを含むAVIファイルが実行されないため、作成されません。

于 2012-08-13T04:42:56.320 に答える