0

我最近买了一台 GigE 相机,它与它的 SDK 捆绑在一起。其中一个示例解释了如何通过回调函数从相机中抓取帧。它的工作方式如下:

void OnImageGrabbed(Image* pImage, const void* pCallbackData)
{
    printf( "Grabbed image %d\n", imageCnt++ );
    return;
}

//...

int main(int argc, char** argv)
{
    camera.StartCapture(OnImageGrabbed);
}

以上基于一个简单的 cpp 程序(不涉及对象)。

现在我正在尝试将功能合并到我的面向对象应用程序中(用 openFrameworks 编写)。对于如何做到这一点,我真的很模糊,而且我无法在互联网上找到足够接近的例子。

基本上我在我的header文件中做了什么:

class ofApp : public ofBaseApp{

    public:
        void setup();
        void update();
        void draw();

        friend void OnImageGrabbed(Image* pImage, const void* pCallbackData);

        bool bNewFrameArrived;
};

然后在我的implementation(.cpp)文件中

void ofApp::setup()
{
    bNewFrame = false ;
    cam.StartCapture(OnImageGrabbed);
}

void OnImageGrabbed(Image* pImage, const void* pCallbackData)
{
    bNewFrame = false ;
    cout<< "Grabbed image" << endl;

    bNewFrame = true ;
}

void ofApp::update(){
    //somehow grab the pImage. but how???

    if ( bNewFrame ) 
        //do stuff
}

把它作为朋友类很好,但我怎样才能访问ofApp类的实例化(即 bNewFrame 变量)?另外,我以后如何pImage从我的update()成员函数访问?

谢谢您的帮助!

4

1 回答 1

1

有几种方法,取决于您是否可以使用成员函数甚至 lambdas 作为回调。如果它是 C 风格的函数指针,那么选项会受到一些限制。

首先,您可以添加静态std::dequestd::vector文件范围,其中回调推送图像指针。之后,处理Image队列/向量持有的任何指针。请参阅以下内容。

static std::vector<Image*> s_imageQueue;
....

void onImageGrabbed(Image* image, const void* callbackData)
{
    s_imageQueue.push_back(image);
}
...

void ofApp::update()
{
    ...
    for (auto image : s_imageQueue)
    {
        // process image
    }
    s_imageQueue.clear();
    ...
}

如果camera.StartCapture()接受std::function<void(Image*,const void*)>,您可以执行以下操作。

void ofApp::setup()
{
    camera.StartCamera( [] (Image* image, const void* data) {
        // process image here
    });
}
于 2014-04-10T23:02:02.623 回答