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