自定义算法模块添加多幅图像输入的方法
自定义算法模块如何添加多幅图像输入,从而扩展到双目视觉算法领域?

通过自带算法模块生成器生成的模块默认只支持单幅图像输入,如果需要添加多幅图像输入,则需要按照下述步骤对模块xml文件和C++算法代码进行修改和补充。

1. 界面区别

单目视图算法模块基本参数界面:


双目视图算法模块基本参数界面:

2. 界面XML修改

在模块名.xml的图像输入部分,增加图像输入源2,名称可自定义(图像名、宽、高、像素格式均需要重命名)。

接着打开模块名AlgorithmTab.xml,将图像输入Category段改为如下所示(注意:OperationParams名必须与模块名.xml中Filter Name一致):

<Category Name="图像输入">
	<Items>
		<EnumerationG Name="ImageSource">
			<Description>Input Source 1</Description>
			<DisplayName>RunParam_Input Source 1</DisplayName>
			<Visibility>Beginner</Visibility>
			<AccessMode>O</AccessMode>
			<Triggers>
				<Trigger>
					<Property>CurValue</Property>
					<Setters>
						<Setter>
							<OperationName>SetCombinationSourceOperation</OperationName>
							<OperationParams>InputImage</OperationParams>
						</Setter>
					</Setters>
				</Trigger>
			</Triggers>
			<Initers>
				<Setter>
					<TargetName>EnumEntrys</TargetName>
					<OperationName>GetFrontParamItemsOperation</OperationName>
					<OperationParams>IMAGE</OperationParams>
				</Setter>
				<Setter>
					<TargetName>CurValue</TargetName>
					<OperationName>GetSelectedCombinationOperation</OperationName>
					<OperationParams>InputImage</OperationParams>
				</Setter>
			</Initers>
		</EnumerationG>
		<EnumerationG Name="ImageSource2">
			<Description>Input Source 2</Description>
			<DisplayName>RunParam_Input Source 2</DisplayName>
			<Visibility>Beginner</Visibility>
			<AccessMode>O</AccessMode>
			<Triggers>
				<Trigger>
					<Property>CurValue</Property>
					<Setters>
						<Setter>
							<OperationName>SetCombinationSourceOperation</OperationName>
							<OperationParams>InputImage2</OperationParams>
						</Setter>
					</Setters>
				</Trigger>
			</Triggers>
			<Initers>
				<Setter>
					<TargetName>EnumEntrys</TargetName>
					<OperationName>GetFrontParamItemsOperation</OperationName>
					<OperationParams>IMAGE</OperationParams>
				</Setter>
				<Setter>
					<TargetName>CurValue</TargetName>
					<OperationName>GetSelectedCombinationOperation</OperationName>
					<OperationParams>InputImage2</OperationParams>
				</Setter>
			</Initers>
		</EnumerationG>
	</Items>
</Category>

3. 底层算法代码修改

由于输入为两幅图像,而标准Demo中GenerateImage函数是获取单幅图像,因此需要重写获取图像的方法,示例代码如下:

/// <summary>
/// 获取两幅输入图像(HKA_IMAGE)
/// </summary>
/// <param name="hInput">输入体指针</param>
/// <returns></returns>
int CAlgorithmModule::GetInputImage(IN void* hInput, bool &bCamera1, bool &bCamera2, HKA_IMAGE struInputImg[2])
{
	HKA_S32             nRet = IMVS_EC_UNKNOWN;
	HKA_U32             nImageStatus = 0;

	//HKA_IMAGE struInputImg[2];
	do
	{
		nRet = VmModule_GetInputImageByName(hInput,
			"InImage",
			"InImageWidth",
			"InImageHeight",
			"InImagePixelFormat",
			&struInputImg[0],
			&nImageStatus);
		HKA_CHECK_BREAK(IMVS_EC_OK != nRet);
		bCamera1 = true;
	} while (0);

	do
	{
		nRet = VmModule_GetInputImageByName(hInput,
			"InImage2",
			"InImage2Width",
			"InImage2Height",
			"InImage2PixelFormat",
			&struInputImg[1],
			&nImageStatus);
		HKA_CHECK_BREAK(IMVS_EC_OK != nRet);
		bCamera2 = true;
	} while (0);

	return nRet;
}

最后,在Process函数中调用该方法,即可获取两张输入图像,示例代码如下:

//获取输入的两张图片
bool bCamera1 = false;
bool bCamera2 = false;
HKA_IMAGE struInputImg[2];
int nRet = GetInputImage(hInput, bCamera1, bCamera2, struInputImg);
if (!bCamera1 && !bCamera2)
{
	//两个图片都没有,返回错误
	return IMVS_EC_MODULE_SUB_RST_NOT_FOUND;
}
if (IMVS_EC_OK != nRet)
{
	return IMVS_EC_MODULE_INPUT_NOT_FOUND;
}

如果基类中没有VmModule_GetInputImageByName方法,则将下面这段代码复制粘贴到VmModule_IO.cpp中。

HKA_S32 VmModule_GetInputImageByName(IN const void * const hInput,
                                     char          *strImage,
                                     char          *strWidth,
                                     char          *strHeight,
                                     char          *strFormat,
                                     HKA_IMAGE     *image,
									 HKA_U32       *imageStatus)
{
    HKA_S32          nRet          = IMVS_EC_UNKNOWN;
    HKA_S32          format        = 0;
    HKA_IMAGE_FORMAT formatAlg     = HKA_IMG_MONO_08;
    HKA_U32          nStatusImage  = IMVS_MODU_ENUM_STATUS_ERROR;
    HKA_U32          nStatusWidth  = IMVS_MODU_ENUM_STATUS_ERROR;
    HKA_U32          nStatusHeight = IMVS_MODU_ENUM_STATUS_ERROR;
    HKA_U32          nStatusFormat = IMVS_MODU_ENUM_STATUS_ERROR;
    char*			 addr          = 0;

    HKA_CHECK_ERROR(HKA_NULL == hInput,      IMVS_EC_PARAM);
    HKA_CHECK_ERROR(HKA_NULL == image,       IMVS_EC_PARAM);
    HKA_CHECK_ERROR(HKA_NULL == imageStatus, IMVS_EC_PARAM);

    nRet = VmModule_GetInputImageAddress(hInput, strImage, &addr, &nStatusImage);
    HKA_CHECK_ERROR(IMVS_EC_OK != nRet, nRet);

    nRet = VmModule_GetInputScalar_32i(hInput, strWidth, &(image->width), &nStatusWidth);
    HKA_CHECK_ERROR(IMVS_EC_OK != nRet, nRet);

    nRet = VmModule_GetInputScalar_32i(hInput, strHeight, &(image->height), &nStatusHeight);
    HKA_CHECK_ERROR(IMVS_EC_OK != nRet, nRet);

    nRet = VmModule_GetInputScalar_32i(hInput, strFormat, &format, &nStatusFormat);
    HKA_CHECK_ERROR(IMVS_EC_OK != nRet, nRet);

    if(image->height <= 0)
    {
        nStatusHeight = IMVS_MODU_ENUM_STATUS_INPUT_INVALID;
    }

    if(image->width <= 0)
    {
        nStatusWidth = IMVS_MODU_ENUM_STATUS_INPUT_INVALID;
    }

    *imageStatus =   (IMVS_MODU_ENUM_STATUS_OK == nStatusImage)
                  && (IMVS_MODU_ENUM_STATUS_OK == nStatusWidth)
                  && (IMVS_MODU_ENUM_STATUS_OK == nStatusHeight)
                  && (IMVS_MODU_ENUM_STATUS_OK == nStatusFormat);

    nRet = VmModule_iMVSFormatToAlgFormat(format, &formatAlg);
    HKA_CHECK_ERROR(HKA_TRUE != nRet, nRet);

    image->format  = formatAlg;
    image->data[0] = addr;
    image->step[0] = (HKA_IMG_RGB_RGB24_C3 == formatAlg) ? (3 * image->width) : image->width;

    return IMVS_EC_OK;
}

至此,就能实现模块两幅图像的输入与获取。

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

VM4.2二次开发环境配置方法(入门必看)

下一篇

自定义算法模块点集输入、输出实现方法

评论请先登录 登录
全部评论 1

感谢楼主的分享,mark一下,以后肯定能用得上的😀

2023-01-17 10:11:53 未知地区
回复
  • 1
Lv.0
2
关注
47
粉丝
13
创作
87
获赞
所属专题
  • 自定义算法模块添加多幅图像输入的方法
  • 自定义算法模块点集输入、输出实现方法
  • 自定义算法模块输出和显示矩形检测框的方法
  • 自定义算法模块获取输入直线的方法
  • 自定义算法模块打印日志的方法
  • YoloV5ForVisionMaster
  • Sauvola二值化处理在图像处理应用的优势介绍分析
相关阅读
  • [共享学习]VM之角度纠正问题
    2024-03-07 浏览 0
  • 机器视觉菜鸟指南
    2024-02-29 浏览 0
  • 基于C++OpenCV实现VisionMaster中的“直线边缘缺陷检测”
    2024-03-04 浏览 0

请升级浏览器版本

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

推荐使用以下浏览器