1

我有这个简短的 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 编译。

4

1 回答 1

2

疯狂的猜测......但可能它StartCapture已经开始了最终将缓冲区放入的过程ìmage,如果你踩到它,你会离开一段时间,直到你到达RetrieveBuffer。如果你一次运行它,情况并非如此......

于 2013-08-29T20:58:35.347 回答