c++11 回调函数(以相机SDK采集图像的方式进行讲解)

学习记录~
本文来自博客园,作者:拾荒荒,转载请注明原文链接:https://www.cnblogs.com/lvvou/p/14975054.html
回调函数引意
假设有AB两个类,B类是我们自己写的应用类,A类为第三方类相机类,如下!

在这里插入图片描述

在设计A类的时候,该类的设计者肯定想把相机采集到的图片实时传递给应用者(此时是我们B类),而我们B类在设计应用程序的时候也想实时获取到相机采集到的图片,那B类中该怎么做呢?第一想到的方法就

是一直死循环轮询A类对象调用相关成员函数获取到实时图像。这种方式无疑不造成一种资源的浪费,而且占用很大的CPU资源。

那么有没有一种方式,当只有A类采集到图像的时候才去通知B类去获取图像这样的方式呢?答案是有的,这就引出我们今天讨论的主题:回调函数!

回调函数主要过程就是:把B类的函数注册(传递函数指针)给 A类,当A类采集到图像,就调用刚注册进来的B类函数,这样就间接完成了,由A类去通知B类去做某事
在这里插入图片描述

在这里插入图片描述

由以上图可知,把B类的函数注册给了A类。

知道了回调函数的用意,接下来就是编写代码演示过程

此次演示,我们使用c++11标准来编写代码

#include <iostream>
#include <functional>
using namespace std;

/*回调函数原型声明*/
typedef function<void(int)> CALLBACK;

/*相机SDK底层A类*/
class A_Camera
{
public:
	void regeditCallBack(CALLBACK fun)/*注册回调函数*/
	{
		_fun = fun;
	}

	void getFrame()/*内部获取图像函数(B类调用者不需要关心它什么时候会执行)*/
	{
		/*采集到一帧数据_frame*/
		/****内部操作***/
		/***内部操作***/

		_frame = rand() % 10;
		_fun(_frame);/*回传给B_My类*/
	}

private:
	int _frame;
	CALLBACK _fun;
};

/*应用层B类*/
class B_My
{
public:
	void callBackFun(int frame)/*获取到A类的图像,此时frame就是一帧数据*/
	{
		cout << "B类获取到一帧数据:" << frame << endl;
	}
};

int main(int argc, char **argv)
{
	/*声明应用层B类对象*/
	B_My B; 

	auto Fun = bind(&B_My::callBackFun, B, placeholders::_1);/*中转一下,利用C++11特性*/

	/*声明底层相机A类*/
	A_Camera camera;
	camera.regeditCallBack(Fun);/*把B类的方法注册给A类*/

	/*以下只是模拟A类内部触发获取到图片,一共模拟触发10次*/
	for (int i = 0; i < 10; ++i)
	{
		camera.getFrame();
	}

	return 0;
}

运行结果
在这里插入图片描述
总结
通过相机回调的方式,简单的对回调函数进行一次分析,第一次接触时回调函数机制会有点困难,但多看几遍心里就会有点感觉。例子涉及到c++11方面的知识,可以暂时忽略,不影响对回调函数的理解

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
海康工业相机是一种常见的工业相机品牌,其SDK(软件开发工具包)提供了编程接口以便开发者可以通过程序进行图像采集和处理等操作。下面是一个简单的实例,以说明如何使用海康工业相机SDK进行图像采集: 首先,你需要在电脑上安装海康工业相机SDK,并添加相应的库文件到项目中。 然后,你需要创建一个工程并引入相关的头文件: #include "HCNetSDK.h" #include "plaympeg4.h" 接着,在程序的初始化阶段,你需要调用SDK的初始化函数: NET_DVR_Init(); 之后,你需要登录相机设备: LONG lUserID; NET_DVR_DEVICEINFO_V30 struDeviceInfo; lUserID = NET_DVR_Login_V30("192.168.0.1", 8000, "admin", "password", &struDeviceInfo); 在成功登录相机设备后,你可以设置采集图像的参数,例如图像分辨率、帧率等: NET_DVR_SetCapturePictureMode(lUserID, NET_DVR_JPEG_MODE); 然后,你可以开始进行图像采集了,可以选择采集方式为实时预览或者抓取一张静态图像: // 实时预览 LONG lRealPlayHandle; HWND hWnd = GetDesktopWindow(); // 获取窗口句柄 lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, struDeviceInfo.byStartChan, NULL, NULL, hWnd); // 抓取静态图像 NET_DVR_CaptureJPEGPicture(lUserID, struDeviceInfo.byStartChan, &struPicParam, "D:\\test.jpg"); 最后,在程序结束时,你需要释放相关资源并注销登录: NET_DVR_StopRealPlay(lRealPlayHandle); NET_DVR_Logout(lUserID); NET_DVR_Cleanup(); 以上是一个简单的实例,通过调用海康工业相机SDK实现图像采集。在实际应用中,你可以根据需求进行更复杂的图像处理操作,例如图像分析、识别等。请注意在实际操作中根据具体的SDK版本和相机型号进行适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值