多路海康网络摄像头数据实时回调(采用软解码方式)
由于项目中需要访问多路海康摄像头的原始图像进行相关处理,搜索了大量的博客,对于多路海康摄像头回调都没有写的很清楚明白,看到此博客的你,静下心来研读下面的内容,你将会很容易调取多路海康网络摄像头。
(1)下载海康官网提供的SDK https://www.hikvision.com/cn/download_more_570.html 本人用的是Win64
(2)解压完毕打开“CH-HCNetSDKV5.3.5.46_build20180518_Win64/Demo示例/2- MFC分功能示例/2- 实时流回调解码获取YUV”工程,在*Dlg.cpp文件可以看到很重要的两个回调函数(DecCBFun、fRealDataCallBack),这两个回调函数是实现多路回调的关键所在
(3)如何加载自己的海康网络摄像头,本人整理成一个函数方便大家调用,如下:
需要打开几路摄像头,就需要几个Open,其中Open函数的形参void(CALLBACK *fRealDataCallBack_V30),这个参数便需要填写上面的回调函数fRealDataCallBack,需要访问几路摄像头,就需要有几个fRealDataCallBack(这句话大家可能会产生疑惑),理解如下,先看一下fRealDataCallBack函数源码:
这里要特别关注两个参数(nPort、DecCBFun),发现这两个参数都不是fRealDataCallBack的形参,nPort参数可看作是全局变量,DecCBFun又是一个回调函数,因此出现了回调函数再调用回调函数的现象,蛮有趣,这类情形至今我只见过海康这样用,学到了。对于nPort的理解,个人猜想它是不同路摄像头的标识,即所加载的多路摄像头,每路摄像头对应的nPort返回值不同。
(4)我们再来查看DecCBFun回调函数源码:
会发现nPort居然是DecCBFun的形参,而且这个回调函数中将海康的图像数据转换成了YUV数据,看到YUV数据是不是很开心呢,因为可以用opencv将YUV转换到RGB图像,从而将海康数据流取出来用于后续数据处理。
假如上面的猜测成立,则有几路摄像头就应该对应几个nPort,因此回到最初的理解,有几路摄像头就应该有几个Open,有几个Open就应该有几个fRealDataCallBack,有几个fRealDataCallBack就应该有几个nPort,是不是也应该有几个DecCBFun呢?
最初我在系统开发中就用了多个DecCBFun,发现对于更多路的摄像头时CPU吃不消,原来只需要用一个DecCBFun就可以了,这里要将nPort利用上,比如我们做九路海康摄像头回调,便可将DecCBFun修改为如下:
此时CPU利用率较低,贼爽,成功实现了多路海康摄像头回调,并实时传出opencv格式数据用于后续处理。
后续考率将工程源码开源出来