算法dll开发

步骤

  1. 打开 vs2017,创建一个空项目;
  2. 添加一个算法库工程,选择 Qt class library,命名为{ 算法名 };
  3. 将依赖拷贝到算法工程目录下;
  4. 右键配置工程属性;
    • c/c++ -> 预处理器 -> 预处理器定义 -> 添加 MODULE_LIB
    • 链接器 -> 常规 -> 附加库目录 -> 添加 .\lib
  5. 新建算法c++类,添加#include "module_plugin_register.h",算法类继承AbstractModule;
  6. 实现 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)

设置模块的基准图像。当基准图像被更改时会调用本函数。