一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
 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中,只有一个共享参数类做为基类,是一种最简单有效实现各个算法子模块解耦的方式。

记录一下心得体会:

  1. 在接口文件中,通常需要设置一个void *pHandle的空指针,目的是为了SDK加密,只有在算法内部时,才会强制转换成实际应用类型的指针;
  2. 针对void* pHandle的空指针,如果传递到create_handle函数中时,需要传递二级指针,否则无法改变pHanlde指针内部指向的内容。因为,此时形参和实参,仅仅只是浅拷贝了指针。
  3. 使用pHandle初始化param结构体,最后将param结构体传入每个算法子模块类,在每个子模块类中,会去初始化共享参数类(基类),从而实现参数共享,算法模块解耦。

这里有个C++的知识点就是:

  • 在传递一级指针时,只有对指针所指向的内存变量做操作才是有效的;
  • 在传递二级指针时,只有对指针的指向做改变才是有效的;
posted on 2022-08-05 15:18  一杯清酒邀明月  阅读(483)  评论(1编辑  收藏  举报