3

私はステレオカメラシステムを持っています。私のプログラムでは、2つのスレッドで各カメラからの画像をキャプチャします。(カメラごとに1つのスレッド)。各カメラから画像を受け取ったら、OpenCVで処理したいと思います。両方のカメラスレッドが画像を取得し、それらを処理することができると、プログラムにどのように言うことができますか?

別の質問があります。カメラから受信したすべてのフレームには、カメラによって指定されたタイムスタンプがあります。同時にキャプチャされた2台のカメラから画像を取得するために、タイムスタンプを一致させるにはどうすればよいですか?

4

1 に答える 1

1

カメラによってキャプチャされたフレームを表示するためにOpenCVを使用してアプリケーションを作成したことがありますか?そこから始めましょう。以下のアプリケーションはそれを行い、各フレームをそのグレースケールバージョンに変換します。

CvCapture *capture = NULL;
capture = cvCaptureFromCAM(-1); //-1 or 0 depending on your platform
if (!capture)
{
    printf("!!! ERROR: cvCaptureFromCAM\n");
    return -1;
}

cvNamedWindow("video", CV_WINDOW_AUTOSIZE);

while (exit_key_press != 'q')
{
    /* Capture a frame */
    color_frame = cvQueryFrame(capture);
    if (color_frame == NULL)
    {
        printf("!!! ERROR: cvQueryFrame\n");
        break;
    }
    else
    {
        // WOW! We got a frame! 
        // This is the time to process it since we are not buffering 
        // the frames to use them later. It's now or never.

        IplImage* gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1);  
        if (gray_frame == NULL)
        {
            printf("!!! ERROR: cvCreateImage\n");
            continue;
        }

        cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY);
        cvShowImage("Grayscale video", gray_frame);
        cvReleaseImage(&gray_frame);
    }
        exit_key_press = cvWaitKey(1);
}

フレームはループ内で取得されていることに注意してください。ループを終了すると、カメラからのデータの受信が停止します。それは理にかなっていますよね?これにより、2つのオプションが残ります。

  • フレームを正しく処理します。ただし、この処理が遅い場合は、次のcvQueryFrame()操作までカメラから数フレームを見逃す可能性があります。

  • 別のスレッドで処理を実行できるように、何らかのバッファメカニズムを使用してフレームを保存します。これは、処理技術がCPUに要求を課している場合や、フレームを失いたくない場合に適したアプローチです。

あなたの2番目の質問について、あなたが何を意味するのか私にはわかりません。さらに詳しく説明してください。

于 2011-04-20T18:37:21.183 に答える