0

以下は、このプロジェクトで OpenCV を使用して実行する手順です。

1) 1 キーを押したときに 1 フレームをキャプチャします。

2) ウェブカメラを移動する

3) 2 キーを押したときに 2 番目のフレームをキャプチャします。

4) 両方の画像を表示します。

ここに私が取り組んでいるコードがあります:

int main(int, char**){
    VideoCapture cap(1);
    Mat img1, img2;
    int input;
    namedWindow("Imagen 1",CV_WINDOW_AUTOSIZE);
    namedWindow("Imagen 2",CV_WINDOW_AUTOSIZE);

for(;;){
    input = cvWaitKey(40);
    if((char) input ==27)
        break;
    if ((char) input == 49){
        cap >> img1;
        imshow("Imagen 1",img1);
    }
    if ((char) input == 50){
        cap >> img2;
        imshow("Imagen 2",img2);
    }
}
    return 0;
}

ただし、これを実行すると、両方のウィンドウで同じ画像が表示されます。なぜこれが起こっているのか誰でも説明できますか?私が説明したように機能させるにはどうすればよいですか?

4

3 に答える 3

1

Linux で作業している場合は、キャプチャ デバイスからバッファを空にする必要があります。フレームを読み取り、最後のフレームのみを記憶する別のスレッドを実行することでそれを行います。さらに処理するためにフレームを取得したい場合は、現在記憶されているフレームを複製します。しかし、あなたの場合は少しやり過ぎかもしれません。

また、現在のメインループの代わりに次のようなことをしたいかもしれません:

cv::Mat temp,img1,img2;
cv::VideoCapture cap(1);
char control=' ';
cv::namedWindow("current",CV_AUTOSIZE);
cv::namedWindow("img1",CV_AUTOSIZE);
cv::namedWindow("img2",CV_AUTOSIZE);
do{
    if(49 == control){
        img1=temp.clone();
        cv::imshow("img1",img1);
    }else if(50 == control){
        img2=temp.clone();
        cv::imshow("img2",img2);
    }
    cap>>tmp; //emptying buffer all the time
    cv::imshow("current",tmp);
    control=cv::waitKey(40);//if You are faster than captures fps
}while(27 != control);
于 2013-06-17T15:34:15.590 に答える
0

呼び出しをループ内に配置する必要がありcap()ます-そうしないと、キャプチャを1回だけ実行します

于 2013-06-16T18:10:27.830 に答える