1

Point Grey Research BumbleBee 2 カメラとその SDK を使用しています。フレームを連続して取得するためのこのループがありますが、機能していません。最初のフレームを正常に取得しますが、表示されている画像は最初のフレームからのものであるため、triclopsGetImage() は refImage(R|L) の内容を更新していないようです...誰でも Point Grey Cameras または triclops SDK の経験があります?

   //There's more code above

   int nframes = 20;
   for (int frame = 0; frame < nframes ; frame++ ) {

       te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR );
       te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL );

       cv::Mat leftIm(cv::Mat::zeros(refImageR.nrows,refImageR.ncols,CV_8UC1));
       cv::Mat rightIm(cv::Mat::zeros(refImageR.nrows,refImageR.ncols,CV_8UC1));
       int counter = 0;
       for (int row=0;row<refImageR.nrows;row++) {
           for (int col=0;col<refImageR.ncols;col++) {
               leftIm.at<uchar>(row,col) = refImageL.data[counter];
               rightIm.at<uchar>(row,col) = refImageR.data[counter];
               counter++;
           }
       }

       imshow("LeftIm",leftIm);
       imshow("RightIm",rightIm);

       cv::waitKey(1000);
       cout << "frame = " << frame << endl;
   }

編集

わかりました、これは決してエレガントではありませんが、役立つと思います。これを行っても、最初のフレームの内容しか取得できません。cv::Mat leftIm と rightIm がデータを保持していて更新されていないか、triclops に問題があると考えています。

TriclopsContext triclops;

ヘッダー ファイルから、「TriclopsContext は、Triclops ライブラリに必要なすべての画像と簿記情報を維持する内部構造へのポインターです。すべてのパラメーターのコンテナーです」と書かれています。

for (int frame = 1; frame < nframes ; frame++ ) {

       if (frame == 1) {
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR1 );
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL1 );
       } else if (frame == 2) {
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR2 );
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL2 );
       } else if (frame == 3) {
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR3 );
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL3 );
       } else if (frame == 4) {
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR4 );
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL4 );
       } else if (frame == 5) {
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_RIGHT, &refImageR5 );
            te = triclopsGetImage( triclops, TriImg_RECTIFIED, TriCam_LEFT, &refImageL5 );
       }

       cv::Mat leftIm(cv::Mat::zeros(refImageR1.nrows,refImageR1.ncols,CV_8UC1));
       cv::Mat rightIm(cv::Mat::zeros(refImageR1.nrows,refImageR1.ncols,CV_8UC1));
       int counter = 0;
       for (int row=0;row<refImageR1.nrows;row++) {
           for (int col=0;col<refImageR1.ncols;col++) {
               //leftIm.at<uchar>(row,col) = refImageL.data[counter];
               //rightIm.at<uchar>(row,col) = refImageR.data[counter];
               if (frame == 1) {
                    leftIm.at<uchar>(row,col) = refImageL1.data[counter];
                    rightIm.at<uchar>(row,col) = refImageR1.data[counter];
               } else if (frame == 2) {
                    leftIm.at<uchar>(row,col) = refImageL2.data[counter];
                    rightIm.at<uchar>(row,col) = refImageR2.data[counter];
               } else if (frame == 3) {
                    leftIm.at<uchar>(row,col) = refImageL3.data[counter];
                    rightIm.at<uchar>(row,col) = refImageR3.data[counter];
               } else if (frame == 4) {
                    leftIm.at<uchar>(row,col) = refImageL4.data[counter];
                    rightIm.at<uchar>(row,col) = refImageR4.data[counter];
               } else if (frame == 5) {
                    leftIm.at<uchar>(row,col) = refImageL5.data[counter];
                    rightIm.at<uchar>(row,col) = refImageR5.data[counter];
               }

               counter++;
           }
       }

       imshow("LeftIm",leftIm);
       imshow("RightIm",rightIm);

       cv::waitKey(1000);
       cout << "frame = " << frame << endl;
   }
4

1 に答える 1

1

Triclops SDK フォルダーの例を見ると、プログラムが画像を取得する前に次のメソッドを呼び出していることがわかります。

error = triclopsPreprocess( context, &inputData );
error = triclopsStereo( context );

次のフレームの視差を計算するようにカメラに指示するために、ループの最後でこれらを呼び出す必要がある場合があります。

于 2012-10-25T14:50:03.360 に答える