- 自定义算法模块添加多幅图像输入的方法
 - 自定义算法模块点集输入、输出实现方法
 - 自定义算法模块输出和显示矩形检测框的方法
 - 自定义算法模块获取输入直线的方法
 - 自定义算法模块打印日志的方法
 - 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);
} 模块运行效果如下图所示。
