1.SvpSampleMtcnnOneModel
下面是伪代码,只保留了函数内的关键几个函数
HI_S32 SvpSampleMtcnnOneModel(const HI_CHAR *pcModelName, const HI_CHAR *pcImageName,
const HI_FLOAT scale, const HI_U32 width, const HI_U32 height,
const MTCNN_NET_TYPE enNetType,
SVP_SAMPLE_BOX_S* targetBox,
std::vector<SVP_SAMPLE_BOX_S>& resultBoxs,
std::vector<MTCNN_KEYPOINT>* resultKeypoint)
{
。。。
//加载模型,申请mmz空间
s32Ret = SvpSampleOneSegDetCnnInit(&stDetCfg, &stDetParam, bLoadImgList);
//读入图片
s32Ret = SvpSampleReadBoxSrcImg(stDetParam.astSrc, 0, (HI_CHAR*)pcImageName, targetBox, HI_TRUE);
//forward计算
s32Ret = SvpSampleCnnDetectionForword(&stDetParam, &stDetCfg);
//获取结果
s32Ret = MtcnnGetOneModelResult(enNetType, &(stDetParam.astDst[0]), scale,
width,
height,
targetBox,
resultBoxs,
resultKeypoint);
。。。
}
stDetParam存储了模型信息,
stDetParam.stModel.astSeg->u16SrcNum:输入节点个数
stDetParam.stModel.astSeg->astSrcNode[i].szName:输入节点 i 的名字
stDetParam.stModel.astSeg->u16DstNum:输出节点个数
stDetParam.stModel.astSeg->astDstNode[i].szName:输出节点 i 的名字
所以MtcnnGetOneModelResult函数这样获取结果,pstDstBlob+i就代表某个输出节点,对应上面的打印。
static HI_S32 MtcnnGetOneModelResult(。。。)
。。。
case MTCNN_NET_P:
return MtcnnGetBoxs12Net(pstDstBlob, pstDstBlob + 1, u32OutSide, 1 / scale, width, height, 0.6, resultBoxs);
case MTCNN_NET_R:
return MtcnnGetBoxs24Net(pstDstBlob + 1, pstDstBlob, targetBox, width, height, 0.6, resultBoxs);
case MTCNN_NET_O:
return MtcnnGetBoxs48Net(pstDstBlob + 2, pstDstBlob + 1, pstDstBlob, targetBox, width, height, 0.7, resultBoxs, resultKeypoint);
。。。
2.mtcnn_draw_result2
为了能更好的分析坐标信息,我加了一些绘图动作
void mtcnn_draw_result2(const HI_CHAR* image, vector<SVP_SAMPLE_BOX_S>& resultBox, vector<MTCNN_KEYPOINT>* resultKeypoint, const HI_CHAR* outImage)
{
//#ifdef USE_OPENCV
cv::Mat dstMat = cv::imread(image);
HI_FLOAT fFontSize = 0.5f;
c