- 自定义算法模块添加多幅图像输入的方法
- 自定义算法模块点集输入、输出实现方法
- 自定义算法模块输出和显示矩形检测框的方法
- 自定义算法模块获取输入直线的方法
- 自定义算法模块打印日志的方法
- YoloV5ForVisionMaster
- Sauvola二值化处理在图像处理应用的优势介绍分析
通过自带算法模块生成器生成的模块默认只支持单幅图像输入,如果需要添加多幅图像输入,则需要按照下述步骤对模块xml文件和C++算法代码进行修改和补充。
单目视图算法模块基本参数界面:
双目视图算法模块基本参数界面:
在模块名.xml的图像输入部分,增加图像输入源2,名称可自定义(图像名、宽、高、像素格式均需要重命名)。
接着打开模块名AlgorithmTab.xml,将图像输入Category段改为如下所示(注意:OperationParams名必须与模块名.xml中Filter Name一致):
Input Source 1
RunParam_Input Source 1
Beginner
O
CurValue
SetCombinationSourceOperation
InputImage
EnumEntrys
GetFrontParamItemsOperation
IMAGE
CurValue
GetSelectedCombinationOperation
InputImage
Input Source 2
RunParam_Input Source 2
Beginner
O
CurValue
SetCombinationSourceOperation
InputImage2
EnumEntrys
GetFrontParamItemsOperation
IMAGE
CurValue
GetSelectedCombinationOperation
InputImage2
由于输入为两幅图像,而标准Demo中GenerateImage函数是获取单幅图像,因此需要重写获取图像的方法,示例代码如下:
///
/// 获取两幅输入图像(HKA_IMAGE)
///
/// 输入体指针
///
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;
}
至此,就能实现模块两幅图像的输入与获取。