我有这个简短的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 Grey 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()<终止它/ em>在它之前。
使用MSVC2010,OpenCV 2.4.5和PGR FlyCapture 2.4R10进行编译。
答案 0 :(得分:2)
狂野猜测......但可能是StartCapture
已经开始了这个过程
最终将缓冲区放在ìmage
中,如果你继续使用,则将其留下一些
到达RetrieveBuffer
之前的时间。如果你一次全部运行它就不是这种情况......