У меня есть эта короткая программа C ++, которая берет снимки с камеры в цикле и отображает их:
void GenericPGRTest::execute()
{
// connect camera
Camera *cam = Camera::Connect();
// query resolution and create view window
const Resolution res = cam->GetResolution();
cv::namedWindow("View");
c = 0;
// keep taking snapshots until escape hit
while (c != 27)
{
const uchar *buf = cam->SnapshotMono();
// create image from buffer and display it
cv::Mat image(res.height, res.width, CV_8UC1, (void*)buf);
cv::imshow("Camera", image);
c = cv::waitKey(1000);
}
}
Это использует класс (камера) для управления камерой, которую я создал, используя Point Grey SDK и функции из библиотеки OpenCV для отображения изображений. Я не обязательно ищу ответы, относящиеся к использованию любой из этих библиотек, но скорее представляю, как отладить причудливую проблему в целом. Проблема в том, что приложение зависает (не падает) на Кам-> SnapshotMono () линия. Конечно, я пробежал эту функцию с помощью отладчика. Вот содержимое:
const uchar* Camera::SnapshotMono()
{
cam_.StartCapture();
// get a frame
Image image;
cam_.RetrieveBuffer(&image);
cam_.StopCapture();
grey_buffer_.DeepCopy(&image);
return grey_buffer_.GetData();
}
Теперь каждый раз, когда я перехожу через функцию в отладчике, все работает нормально. Но в первый раз я делаю «шаг за шагом» вместо «шаг в» SnapshotMono (), бац, программа зависает. Когда я делаю паузу в это время, я замечаю, что он застрял внутри SnapshotMono () на RetrieveBuffer () линия. Я знаю, что это блокирующий вызов, поэтому теоретически он может зависнуть (не знаю почему, но это возможно), но почему он блокируется при нормальной работе, а не при отладке? Это один из самых странных видов поведения при отладке, который я видел до сих пор. Есть идеи, почему это могло произойти?
Для тех, кто знаком с FlyCapture, приведенный выше код не ломается как есть, а только когда я использую StartCapture () в режиме обратного вызова, затем завершите его StopCapture () перед этим.
Скомпилировано с MSVC2010, OpenCV 2.4.5 и PGR FlyCapture 2.4R10.
Дикое предположение … но может быть так StartCapture
уже запускает процесс, который
заканчивается наличием буфера в ìmage
и, если вы сделаете шаг, оставьте
время, пока вы не доберетесь до RetrieveBuffer
, Это не тот случай, если вы запустите все сразу …
Других решений пока нет …