1 //1、根据void* 接口指针创建实际内容指针(为了封装,加密)
2 soft_isp_handle_t pHandle = NULL;
3 st_soft_isp_handle_create(&pHandle);
4
5
6 //2、将pHanle赋予param_t结构体进行构造生成结构体参数
7 softisp_param_t* p_softisp_param = NULL;
8 int raw_num = 3;
9 p_softisp_param = new softisp_param_t(pHandle, raw_num, thread_pool);
10
11 softisp_param_t& softisp_param = *p_softisp_param;
12
13 //3、将结构体参数赋予基类,进行初始化(基类中包含了各个模块的共享参数)
14 //alignment
15 softisp::align align_(softisp_param);
16 align_.under_exposure();
17
18 //fusion
19 softisp::raw_fusion fusion_(softisp_param);
20 fusion_.fusion();
基于C++写算法SDK时,基于顶层设计的考虑,则是需要让算法每个子模块之间互相解耦,同时可以共享meta参数和常用读写图片的函数。
比较高端一点的设计方式,应该是:
- 算法接口模块,需要设计一个algorithm基类,这个基类包含了基本的图像操作函数,同时包含一个共享参数对象。
- 算法模块本身,通常是基于策略模式,分为接口类和策略基类以及具体策略子类。用户调用接口类,而接口类封装了策略基类,而具体策略子类实现了策略基类。
但是在本次算法SDK中,只有一个共享参数类做为基类,是一种最简单有效实现各个算法子模块解耦的方式。
记录一下心得体会:
- 在接口文件中,通常需要设置一个void *pHandle的空指针,目的是为了SDK加密,只有在算法内部时,才会强制转换成实际应用类型的指针;
- 针对void* pHandle的空指针,如果传递到create_handle函数中时,需要传递二级指针,否则无法改变pHanlde指针内部指向的内容。因为,此时形参和实参,仅仅只是浅拷贝了指针。
- 使用pHandle初始化param结构体,最后将param结构体传入每个算法子模块类,在每个子模块类中,会去初始化共享参数类(基类),从而实现参数共享,算法模块解耦。
这里有个C++的知识点就是:
- 在传递一级指针时,只有对指针所指向的内存变量做操作才是有效的;
- 在传递二级指针时,只有对指针的指向做改变才是有效的;