技术标签: 大华摄像头SDK 大华SDK QT
接入了摄像头的登录和客流统计功能,这篇文章我们接入人脸采集功能。
使用QT对接大华网络摄像头SDK的示例程序
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);
取消订阅。