4

別のウィンドウまたは同じウィンドウに同時にビデオを表示する必要がある 2 台のカメラがあります。ただし、次のコードを使用すると、カメラ フィードの 1 つ (camera(1)) のみが表示されます。私のコードで何を変更する必要があるか、または目的の効果を達成する他のコードにリンクする必要があることを誰かが指摘できますか?

NB これはステレオ ビジョン用ではありません。

int main()
{

    //initialize and allocate memory to load the video stream from camera 
    CvCapture *capture1 = cvCaptureFromCAM(0);

    if( !capture1 ) return 1;

    //create a window with the title "Video1"
    cvNamedWindow("Video1");

    while(true) {
        //grab and retrieve each frames of the video sequentially 
        IplImage* frame1 = cvQueryFrame( capture1 );

        if( !frame1 ) break;

        //show the retrieved frame in the "Video1" window
        cvShowImage( "Video1", frame1 );

        //wait for 40 milliseconds
        int c = cvWaitKey(40);

        //exit the loop if user press "Esc" key  (ASCII value of "Esc" is 27) 
        if((char)c==27 ) break;
    }

    //initialize and allocate memory to load the video stream from camera 
    CvCapture *capture2 = cvCaptureFromCAM(1);

    if( !capture2 ) return 1;

    //create a window with the title "Video2"
    cvNamedWindow("Video2");

    while(true) {
        //grab and retrieve each frames of the video sequentially 
        IplImage* frame2 = cvQueryFrame( capture2 );

        if( !frame2 ) break;        

        //show the retrieved frame in the "Video2" window
        cvShowImage( "Video2", frame2 );

        //wait for 40 milliseconds
        int c = cvWaitKey(40);

        //exit the loop if user press "Esc" key  (ASCII value of "Esc" is 27) 
        if((char)c==27 ) break;
    }

    //destroy the opened window
    cvDestroyWindow("Video1"); 
    cvDestroyWindow("Video2");   
    //release memory
    cvReleaseCapture( &capture1 );
    cvReleaseCapture( &capture2 );

    return 0;  

    //VideoCapture1();
    //VideoCapture2();


}
4

3 に答える 3

11

明確にするために、C または C++ を使用していますか? C++ を使用している場合は、OpenCV の C++ インターフェイスを使用してください。

以下の例は私にとってはうまくいきます:

#include <opencv2/opencv.hpp>

int main()
{
    //initialize and allocate memory to load the video stream from camera 
    cv::VideoCapture camera0(0);
    cv::VideoCapture camera1(1);

    if( !camera0.isOpened() ) return 1;
    if( !camera1.isOpened() ) return 1;

    while(true) {
        //grab and retrieve each frames of the video sequentially 
        cv::Mat3b frame0;
        camera0 >> frame0;
        cv::Mat3b frame1;
        camera1 >> frame1;

        cv::imshow("Video0", frame0);
        cv::imshow("Video1", frame1);

        //wait for 40 milliseconds
        int c = cvWaitKey(40);

        //exit the loop if user press "Esc" key  (ASCII value of "Esc" is 27) 
        if(27 == char(c)) break;
    }

    return 0;
}
于 2012-12-18T05:33:31.983 に答える
3

これを試して:

    CvCapture *capture1 = cvCaptureFromCAM(0);
    CvCapture *capture2 = cvCaptureFromCAM(1);

    if( !capture1 ) return 1;
    if (!capture2) return 1 ; 
    cvNamedWindow("Video1");
    cvNamedWindow("Video2") ;

    while(true) {
        //grab and retrieve each frames of the video sequentially 
        IplImage* frame1 = cvQueryFrame( capture1 );
        IplImage* frame2 = cvQueryFrame( capture2 );

        if( !frame1 || !frame2 ) break;

        cvShowImage( "Video1", frame1 );
        cvShowImage( "Video2", frame2 );

        //wait for 40 milliseconds
        int c = cvWaitKey(40);

        //exit the loop if user press "Esc" key  (ASCII value of "Esc" is 27) 
        if((char)c==27 ) break;
    }
于 2012-12-18T03:47:05.043 に答える
2

フレーム 1 とフレーム 2 の宣言を while ループの外に置く

WebCam クラスの作成で同じ問題が発生しました。内部でフレームとキャプチャを宣言した単一のインスタンスでは問題なく動作しましたが、複数のインスタンスではコンストラクタにフレームとキャプチャ ポインタの両方を渡す必要がありました。

openCV は、いくつかの重要な機能をマルチスレッド化できないようです

ところで、X11 では、マルチスレッドを cvWaitKey() で動作させるには、libX11.so.6 にリンクして XInitThreads(); を呼び出す必要があります。main() の最初の命令として

これが Dave laine に役立つことを願っています。

于 2014-02-02T15:49:59.443 に答える