用c++中的回调函数抓取帧.它是如何与班级沟通的

frame grabbing with a callback function in c++. how does it communicate with a class?

本文关键字:c++ 回调 函数 抓取      更新时间:2023-10-16

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

void OnImageGrabbed(Image* pImage, const void* pCallbackData)
{
    printf( "Grabbed image %dn", 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变量)的实例化?此外,我以后如何从update()成员函数访问pImage

谢谢你的帮助!

有几种方法,具体取决于您是否可以使用成员函数甚至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
    });
}