c++ - 在 C++ 中使用回调函数抓取帧。它如何与类(class)交流?

标签 c++ class callback friend-function

我最近买了一台 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;
};

然后在我的实现 (.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

感谢您的帮助!

最佳答案

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

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

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
    });
}

关于c++ - 在 C++ 中使用回调函数抓取帧。它如何与类(class)交流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23000231/

相关文章:

python - 为什么对象类定义会产生影响

javascript - 如何修复 'callback is not a function error'?

ruby-on-rails - 当worker从after_save回调调用时,Sidekiq找不到带有ID的对象

c++ - Boost regex、正则表达式、url 和 img

c++ - 如何将 sql::driver 与智能指针结合起来?

c++ - 从文件C++按字母顺序排序

python - 有没有办法检测 python 程序何时结束?

c++ - 将需要逗号的模板传递给单参数宏

c++ - 如何在 C++ 中交叉包含类?

javascript - 从不同的文件创建 javascript 对象