大家知道我们最近一直在开发EasyCVR的智能识别功能,为了能够将不同的格式及SDK都与我们EasyCVR进行适配,我们也开始对此进行了研究。本文主要是分享一下我们在开发智能识别功能时,涉及到大华SDK以图搜图功能的简介。
该功能的实现主要是先从外部导入一张图片和相似度值,IVSS、NVR等设备通过这张图检索历史库或人脸库是否已经存在匹配的人脸,并返回在相似度之上的图片结果。
下面简述下调用过程:
1、调用 CLIENT_Init 完成 SDK 初始化流程。 2、初始化成功后,调用 CLIENT_LoginEx2 登录设备。 3、调用 CLIENT_StartFindFaceRecognition 设置人脸查询条件。 4、查看以上步骤中的返回值,若接口出参结构体中 nTotalCount 返回的是-1,需要等待设备查询完成。 5、调用 CLIENT_AttachFaceFindState 订阅人脸查询状态。然后等待进度回调函数中的返回进度为 100 时即搜索完成。搜索完成后调用 CLIENT_DetachFaceFindState 取消订阅查询进度。 6、调用 CLIENT_DoFindFaceRecognition 接口获取查询结果。 7、调用 CLIENT_StopFindFaceRecognition 接口结束查询。 8、业务使用完后,调用 CLIENT_Logout 登出设备。 9、SDK 功能使用完后,调用 CLIENT_Cleanup 释放 SDK 资源。
代码示例:
// 查询进度回调函数
void CALLBACK FaceFindState(LLONG lLoginID, LLONG lAttachHandle, NET_CB_FACE_FIND_STATE*
pstStates, int nStateNum, LDWORD dwUser)
{
if (pstStates->nProgress== 100) //表示查询进度 100%
{
// 停止人脸查询进度的订阅
CLIENT_DetachFaceFindState(lAttachHandle);
// 开始查询
DoFind();
}
return;
}
// 配置查询条件
NET_IN_STARTFIND_FACERECONGNITION stuInParam = { sizeof(stuInParam) };
NET_OUT_STARTFIND_FACERECONGNITION stuOutParam = { sizeof(stuOutParam) };
stuInParam.stFilterInfo.dwSize = sizeof(stuInParam.stFilterInfo);
stuInParam.stMatchOptions.dwSize = sizeof(stuInParam.stMatchOptions);
stuInParam.bPersonExEnable = TRUE;
stuInParam.nChannelID = 0;
stuInParam.stMatchOptions.nSimilarity = 80;
stuInParam.stFilterInfo.stStartTime = startTime;
stuInParam.stFilterInfo.stEndTime = endTime;
stuInParam.nBufferLen = nPicBufLen;
stuInParam.pBuffer = strPicBuf; // 图片 Buffer
stuInParam.stPersonInfoEx.wFacePicNum = 1;
stuInParam.stPersonInfoEx.szFacePicInfo[0].dwOffSet = 0;
stuInParam.stPersonInfoEx.szFacePicInfo[0].dwFileLenth = nLength;
BOOL bRet = CLIENT_StartFindFaceRecognition(m_lLoginId, &stuInParam, &stuOutParam, 5000);
if (!bRet)
{
printf("CLIENT_StartFindFaceRecognition: failed! Error code %x.\n", CLIENT_GetLastError());
return -1;
}
m_lFindHandle = stuOutParam.lFindHandle;
|