我有这个简短的 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);
}
}
这使用了一个类 ( Camera ) 来控制我使用 Point Gray SDK 和 OpenCV 库中的函数创建的相机控制来显示图像。我不一定要寻找与使用这些库中的任何一个有关的答案,而是寻找有关如何调试一般奇怪问题的一些见解。问题是应用程序在cam->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()时,bam,程序冻结了。当我当时暂停它时,我注意到它卡在RetrieveBuffer ()行的SnapshotMono()内。我知道这是一个阻塞调用,所以理论上它可以冻结(不知道为什么但它是可能的),但是为什么它在正常运行时阻塞而不是在调试时阻塞?这是迄今为止我在调试中看到的最奇怪的行为之一。知道为什么会发生这种情况吗?
对于熟悉 FlyCapture 的人来说,上面的代码不会按原样中断,而是仅当我在回调模式下使用StartCapture()时,然后在它之前使用StopCapture()终止它。
使用 MSVC2010、OpenCV 2.4.5 和 PGR FlyCapture 2.4R10 编译。