上篇文章接入了摄像头的登录和客流统计功能,这篇文章我们接入人脸采集功能。
上篇文章:使用QT对接大华网络摄像头SDK的示例程序(建议收藏)
本文Demo下载地址:https://download.csdn.net/download/u012534831/12585622
LLONG faceHnd;//智能事件句柄
void Widget::h_openface()
{
if(FALSE == LoginHandle)
{
QMessageBox::about(NULL,laddr->text(),"未连接登录");
return;
}
// 订阅智能事件上报
faceHnd = CLIENT_RealLoadPictureEx(LoginHandle, 0, (DWORD)EVENT_IVS_ALL,TRUE, AnalyzerDataCallBack, (LDWORD)this, NULL);
if(NULL == faceHnd)
{
printf("CLIENT_RealLoadPictureEx: failed! Error code %x.\n", CLIENT_GetLastError());
return ;
}
}
首先,我们要订阅人脸采集的事件,但是对于SDK来说只有一个接口CLIENT_RealLoadPictureEx
,统称为智能事件,而其中第三个参数指定我们要订阅的事件,EVENT_IVS_ALL
代表订阅所有的事件,
EVENT_IVS_FACEDETECT
是人脸检测事件,EVENT_IVS_FACERECOGNITION
是人脸识别事件。
第四个参数是一个 bool 值,代表我们是否需要 SDK 回调的图片数据。没有图片的话可以节省带宽。
第五个参数是一个回调函数,里面包含了智能事件的数据信息。
第六个参数是用户数据,其实你可以传入当前类的指针,以方便在下面的回调函数中使用成员变量,比如我就传入了当前类 Widget
。
//智能事件上报回调函数
int CALLBACK Widget::AnalyzerDataCallBack(LLONG lAnalyzerHandle, DWORD dwAlarmType, void*
pAlarmInfo, BYTE *pBuffer, DWORD dwBufSize, LDWORD dwUser, int nSequence, void *reserved)
{
std::cout << "dwalarmtype:" <<dwAlarmType <<endl;
Widget *w = static_cast<Widget*>((void*)dwUser);
switch(dwAlarmType)
{
// 过滤出你想要的智能事件
case EVENT_IVS_FACERECOGNITION: // 人脸识别事件
{
...
}
break;
case EVENT_IVS_FACEDETECT: // 人脸检测事件
{
QPixmap map;
map.loadFromData(pBuffer,dwBufSize);
w->labelimage->setPixmap(map.scaled(QSize(200,200), Qt::KeepAspectRatio));
}
break;
default:
break;
}
return 0;
}
dwAlarmType
是回调上来的事件类型,pBuffer
是回调的图片数据,dwBufSize
是数据大小,因此我在这儿使用 Qpixmap ,将其显示到 label 上。
CLIENT_StopLoadPic(faceHnd);
取消订阅。