gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:57:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com