自定义算法模块点集输入、输出实现方法
自定义算法模块如何获取输入点集、输出点集,从而扩展到几何基元拟合等算法领域?

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);
}

模块运行效果如下图所示。

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

自定义算法模块添加多幅图像输入的方法

下一篇

自定义算法模块输出和显示矩形检测框的方法

评论请先登录 登录
全部评论 0
Lv.0
机器视觉领域无名之辈。
7
创作
24
粉丝
40
获赞
相关阅读
  • 浅谈VsionMaster:用脚本,做一些好玩的东西。
    2022-12-30
  • 汽车行业|插针检测
    2022-12-26
  • 锂电行业|3D解决方案|锂电表面划痕气泡缺陷检测
    2022-12-19
  • 看看哪条建议是你提的,V社区官方回应来了~~
    2023-01-11
  • 自定义算法模块添加多幅图像输入的方法
    2022-12-19

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器