目前在人脸识别领域中,网络摄像头的使用很普遍,但接入网络摄像头和人脸识别SDK有一定门槛,在此篇中介绍过虹软人脸识别SDK的接入流程,本文着重介绍网络摄像头获取视频流并处理的流程(红色框内),以下内容仅供参考。
市面上目前有很多款网络摄像头,以海康摄像头为例。海康SDK包含很多接口,接入有一定难度,这里只介绍获取视频帧相关的接口。
1.海康SDK接入基本流程
a.初始化并登录验证
NET_DVR_Init();
NET_DVR_DEVICEINFO_V30 struDeviceInfo = { 0 };
long lUserID = NET_DVR_Login_V30(m_cameraIp, m_cameraPort,
m_cameraUser, m_cameraPwd, &struDeviceInfo);
if (lUserID < 0)
{
NET_DVR_Cleanup();
return false;
}
b.创建线程并注册回调函数
thread videoThread(&HCNetCamera::getCameraPreview, this);
videoThread.detach();
bool HCNetCamera::getCameraPreview()
{
NET_DVR_CLIENTINFO ClientInfo;
ClientInfo.lChannel = 1; //Channel number 设备通道号
ClientInfo.hPlayWnd = NULL; //窗口为空,设备SDK不解码只取流
ClientInfo.lLinkMode = 0; //Main Stream
ClientInfo.sMultiCastIP = NULL;
//预览取流
g_realHandle = NET_DVR_RealPlay_V30(g_cameraUserId, &ClientInfo, fRealDataCallBack, NULL, TRUE);
if (g_realHandle < 0)
{
qDebug() << "NET_DVR_RealPlay_V30 failed! Error number: " << NET_DVR_GetLastError();
return false;
}
return true;
}
c.使用回调接口,获取实时的视频帧数据
void CALLBACK fRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser)
{
UNREFERENCED_PARAMETER(lRealHandle);
UNREFERENCED_PARAMETER(pUser);
DWORD dRet = 0;
BOOL inData = FALSE;
switch (dwData