用c++中的回调函数抓取帧.它是如何与班级沟通的
frame grabbing with a callback function in c++. how does it communicate with a class?
我最近买了一台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::deque
或std::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
});
}
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中实现回调
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数