Триклопы «Point Grey Research» читают только 1 кадр

Я использую камеру Point Grey Research BumbleBee 2 и их SDK. У меня есть этот цикл для последовательного захвата кадров, но он не работает. Он захватывает первый кадр в порядке, но triclopsGetImage (), по-видимому, не обновляет содержимое refImage (R | L), так как показанные изображения только с первого кадра … У любого есть опыт работы с камерами Point Grey или с пакетом 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 сохраняют данные и не обновляются, либо что-то не так с триклопами.

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;
}

1

Решение

Если вы посмотрите на пример в папке Triclops SDK, он показывает, что их программа вызывает следующие методы перед получением изображения:

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

Вам может потребоваться вызвать их в конце цикла, чтобы сообщить камере рассчитать расхождения для следующего кадра.

1

Другие решения

Других решений пока нет …