算法dll开发
步骤
- 打开 vs2017,创建一个空项目;
- 添加一个算法库工程,选择 Qt class library,命名为{ 算法名 };
- 将依赖拷贝到算法工程目录下;
- 右键配置工程属性;
- c/c++ -> 预处理器 -> 预处理器定义 -> 添加
MODULE_LIB
; - 链接器 -> 常规 -> 附加库目录 -> 添加
.\lib
;
- c/c++ -> 预处理器 -> 预处理器定义 -> 添加
- 新建算法c++类,添加
#include "module_plugin_register.h"
,算法类继承AbstractModule
; - 实现
AbstractModule
中的虚函数;
虚函数接口说明
必须实现函数:
void release()
用于释放算法库内的内存。当模块被删除时,调用本函数。
void initResultsType(MyResult *result, DrawableResult *draw_result);
用户可以自定义结果数据结构,包括数值型结果 result 和绘制图元 draw_result。当模块第一次被创建出来的时候调用 1 次。
数值型结果支持的数据类型包括:int整数,double小数,str字符串;
绘制图元支持常见的图元,包括:旋转矩形、圆形、直线、十字、字符串等等,具体支持类型参照 result_type.h
文件。
以模板匹配算法模块为例:
// 添加名称为“number”的整数类型结果,用于保存当前找到几个匹配结果
result->addSingleResult("number", BASIC_INT);
// 设置该值的实际有效参数数量始终为1
result->setRealNumber("number", 1);
/*
** 开始创建一个复杂类型结果,该类型类似:
struct
{
double target_x;
double target_y;
double target_angle;
double target_score;
}
** 该数据结构拥有 4 项数据,
** 每一项的数据最多为 10 个,
** 实际使用时,如果只找到了 2 个结果,只需要调用函数 setRealNumber("target", 2) 设置有效数据即可
*/
result->startGroup("target", 4);
for (int i = 0; i < 10; i++)
{
result->addGroupResult("target", "target_x", BASIC_DOUBLE, i);
result->addGroupResult("target", "target_y", BASIC_DOUBLE, i);
result->addGroupResult("target", "target_angle", BASIC_DOUBLE, i);
result->addGroupResult("target", "target_score", BASIC_DOUBLE, i);
}
result->endGroup("target");
// 设置绘制图元要画的只有一种类型
draw_result->setTypeNumber(1);
// 设置绘制图元第一种类型,是 ROTATE_RECT 旋转矩形,且最多可以画10个
draw_result->setElementType(0, DrawElement::ROTATE_RECT, 10);
int prepareParam(int runtime_mode)
该函数用于验证参数是否完备,完备情况下返回0。当必要参数未配置好的时候,返回错误码。请在 error_code.xlsx
文件中添加错误码描述。
该函数在退出配置窗口和运行前,都会执行。
int process(const GtMat *mat, MyResult *result, DrawableResult *draw_result, int runmode_type)
运行时函数,每一帧图像都会调用一次本函数。在本函数内实现算法即可。 本函数内也可以将当前帧运算结果填充好。
int output(MyResult *result, DrawableResult *draw_result)
运行时输出函数,每一帧图像在 process 之后会调用一次本函数,将当前帧运算结果填充好。
int saveParam(const QString &path, const QString &module_id, QJsonObject &json, bool param_only)
保存模块的参数和一些需要保存的图像,参数以 json 的形式表现。在保存工程时被调用。当 param_only 为 true 时,请不要保存图像。
int readParam(const QJsonObject &json, const QString &path, const QString &module_id, bool param_only)
读取模块的参数。在打开工程时被调用。当 param_only 为 true 时,请不要读取图像。
void setReferImage(const GtMat *image)
设置模块的基准图像。当基准图像被更改时会调用本函数。