- 自定义算法模块添加多幅图像输入的方法
- 自定义算法模块点集输入、输出实现方法
- 自定义算法模块输出和显示矩形检测框的方法
- 自定义算法模块获取输入直线的方法
- 自定义算法模块打印日志的方法
- YoloV5ForVisionMaster
- Sauvola二值化处理在图像处理应用的优势介绍分析
1. 在算法模块生成器的自定义输入输出中配置输入点集、输出点集参数
编译界面工程、算法工程,并将文件拷贝到安装目录工具箱后,效果如下图所示。
输入点集、输出点集的参数名称从模块.xml中查看,子元素类型均为float。
2. 在算法工程中获取输入点集的数据
首先在AlgorithmModule.h文件中定义输入、输出点集数组变量,示例代码如下:
#define MVBCALIBTRANS_MAX_POINT_NUM (100000)
HKA_F32 m_fImagePointX[MVBCALIBTRANS_MAX_POINT_NUM]; // 像素坐标X
HKA_F32 m_fImagePointY[MVBCALIBTRANS_MAX_POINT_NUM]; // 像素坐标Y
HKA_F32 m_fWorldPointX[MVBCALIBTRANS_MAX_POINT_NUM]; // 物理坐标X
HKA_F32 m_fWorldPointY[MVBCALIBTRANS_MAX_POINT_NUM]; // 物理坐标Y
然后在AlgorithmModule.cpp文件的Process函数中获取输入的点集数据,示例代码如下:
int nRet = IMVS_EC_UNKNOWN;
HKA_CHECK_ERROR((IMVS_NULL == hInput || IMVS_NULL == hOutput), IMVS_EC_PARAM);
HKA_F32 fValue = 0;
int nCount = 0;
int nArrayCount = 0; // 数组大小
int pointXCount = 0; // X坐标数组大小
int pointYCount = 0; // Y坐标数组大小
// 获取输入点集
nRet = VM_M_GetFloat(hInput, "ImagePointPointX", 0, &fValue, &nArrayCount);
if (IMVS_EC_OK == nRet && nArrayCount > 0)
{
for (int i = 0; i < nArrayCount; ++i)
{
nRet = VM_M_GetFloat(hInput, "ImagePointPointX", i, &fValue, &nArrayCount);
if (IMVS_EC_OK != nRet)
{
break;
}
m_fImagePointX[i] = fValue;
}
pointXCount = nArrayCount;
}
HKA_MODU_CHECK_ERROR(IMVS_EC_OK != nRet, nRet);
nRet = VM_M_GetFloat(hInput, "ImagePointPointY", 0, &fValue, &nArrayCount);
if (IMVS_EC_OK == nRet && nArrayCount > 0)
{
for (int i = 0; i < nArrayCount; ++i)
{
nRet = VM_M_GetFloat(hInput, "ImagePointPointY", i, &fValue, &nArrayCount);
if (IMVS_EC_OK != nRet)
{
break;
}
m_fImagePointY[i] = fValue;
}
pointYCount = nArrayCount;
}
HKA_MODU_CHECK_ERROR(IMVS_EC_OK != nRet, nRet);
HKA_MODU_CHECK_ERROR((pointXCount != pointYCount), IMVS_EC_PARAM);
3. 在算法工程中对输入点集进行处理,给输出点集数组赋值
示例代码如下:
/ 输出物理点
for (int i = 0; i < pointXCount; ++i)
{
m_fWorldPointX[i] = m_fImagePointX[i] + 400;
m_fWorldPointY[i] = m_fImagePointY[i] + 500;
}
4. 在算法工程中设置点集输出
示例代码如下:
if (IMVS_EC_OK == nRet)
{
VM_M_SetInt(hOutput, "ModuStatus", 0, 1); // 模块状态
int nProcessStatus = 1; // 1表示模块正常,0表示模块异常
nRet = VmModule_OutputVector_32f(hOutput, nProcessStatus, m_fWorldPointX, "WorldPointPointX", nArrayCount);
HKA_MODU_CHECK_ERROR(IMVS_EC_OK != nRet, nRet);
nRet = VmModule_OutputVector_32f(hOutput, nProcessStatus, m_fWorldPointY, "WorldPointPointY", nArrayCount);
HKA_MODU_CHECK_ERROR(IMVS_EC_OK != nRet, nRet);
}
else
{
VM_M_SetInt(hOutput, "ModuStatus", 0, 0);
}
模块运行效果如下图所示。