自助下单地址(拼多多砍价,ks/qq/dy赞等业务):点我进入
文章目录
一、海康威视监控摄像头开发SDK介绍
设备网络SDK是基于设备的私网通信合约开发的。 是嵌入式网络硬盘录像机、NVR、网络摄像机、网络球摄像机、视频服务器、解码器、报警主机、网络存储等产品的配套模块。 用于远程访问和控制设备软件的二次开发。 图像预览、文件回放下载、云台控制、布撤防、语音对讲、日志管理、解码卡、远程升级、远程重启/关机、格式化硬盘、参数配置(系统配置、通道配置、串口配置、报警配置、用户配置)、多通道解码器、智能设备功能和采集设备能力集等。
海康威视SDK下载地址:
2.海康SDK模块说明
Windows下的设备网络SDK:
Linux下设备网络SDK库:
设备网络SDK开发包包含以上组件。 必须加载 HCNetSDK.dll 和 HCCore.dll。 对于其他组件,用户可以根据需要选择其中的部分或全部。 下面将分别对SDK中各个组件的功能和使用情况进行说明。
3. Qt工程中海康威视SDK配置
将下载的SDK压缩包解压海康硬盘录像机录像的格式,将SDK解压包中的文件(库文件->include)(头文件->lib)复制到新建的文件夹中
将lib文件夹路径添加到系统环境变量中
在Qt工程中的CMakeList.txt中添加如下代码,即可完成海康威视的SDK导出
# HKVISION
set(HKVISION_DIR "C:\Program Files\HKVISION")
set(HKVISION_INCLUDE_DIR "C:\Program Files\HKVISION\include")
set(HKVISION_LIB_DIRS "C:\Program Files\HKVISION\lib")
include_directories(${HKVISION_INCLUDE_DIR})
link_directories(${HKVISION_LIB_DIRS})
target_link_libraries(${PROJECT_NAME} PUBLIC HCNetSDK PlayCtrl)
4.实时预览摄像头图像程序
海康威视官方实时预览节目流程:
一、初始化海康的SDK
// 1.初始化海康监控SDK
NET_DVR_Init();
然后海康硬盘录像机录像的格式,创建一个包含摄像头IP等信息的NET_DVR_USER_LOGIN_INFO结构和一个NET_DVR_DEVICEINFO_V40 SLR信息结构。 NET_DVR_USER_LOGIN_INFO结构体包含了登录SLR时需要提供的必要信息,如用户名、密码等。 单反的基本信息。
// 2.设置连接相机的信息,用户注册设备
NET_DVR_USER_LOGIN_INFO struLoginInfo = {0}; //包含相机参数的结构体
NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0}; //登录后的相机信息
struLoginInfo.bUseAsynLogin = 0; //同步登录方式
strcpy_s(struLoginInfo.sDeviceAddress, "192.168.1.71"); //设备IP地址
struLoginInfo.wPort = 8000; //设备服务端口
strcpy_s(struLoginInfo.sUserName, "admin"); //设备登录用户名
strcpy_s(struLoginInfo.sPassword, "1234"); //设备登录密码
NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40); //设备登录
NET_DVR_Login_V40()函数说明:
NET_DVR_USER_LOGIN_INFO结构说明:
相机登录成功后,我们就可以开始单反的实时预览了。 实时预览有两种形式,一种是直接给一个窗口ID(HWND),SDK会手动在控件上显示图片,另一种是给一个回调函数,SDK会返回图片数据传给回调函数,用户可以决定如何处理图像数据。 这里只介绍第一种方法,回调函数的形式可以参考海康SDK文档。 无论使用哪种方式,都需要提供NET_DVR_PREVIEWINFO结构体,其中包含SDK如何处理流的信息。
//通过给控件的HWDN,SDK自行进行图像的显示
// 3.启动预览
LONG lUserID = -1; //注册设备ID
LONG lRealPlayHandle = -1; //实时预览控制端口
NET_DVR_PREVIEWINFO struPlayInfo; //实时显示参数设定
struPlayInfo.hPlayWnd = hPlayWnd; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空, Qt中可以通过(HWND)ui->srcImg->winId()获取控件HWND
struPlayInfo.lChannel = 1; //预览通道号
struPlayInfo.dwStreamType = 0; //0-主码流,1-子码流,2-码流3,3-码流4,以此类推
struPlayInfo.dwLinkMode = 0; //0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
struPlayInfo.bBlocked = 0; //0- 非阻塞取流,1- 阻塞取流
NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, NULL, NULL);
NET_DVR_RealPlay_V40函数说明:
NET_DVR_PREVIEWINFO结构说明:
4. 设置NET_DVR_RealPlay_V40()后,SDK会手动将图像流显示给绑定的控件。 如果需要从流中获取一帧图像,可以通过NET_DVR_CapturePictureBlock_New()函数获取。
std::vector<char> inputData(3840*2160*4 + 54); //创建一个数组,大小为图像的H*W*4 + 54,用来保存图像数据
DWORD size= 0; //返回的实际图像大小
DWORD* psize = &size; //指向实际图像大小的指针
NET_DVR_CapturePictureBlock_New(lRealPlayHandle, inputData.data(), (DWORD)inputData.size(), psize) //通过这个函数获取一帧图像数据
cv::_InputArray pic_arr(inputData); //将图像数据转换为OpenCV的数组
Mat grabImg = cv::imdecode(pic_arr, cv::IMREAD_COLOR); //OpenCV数组转换为Mat对象
//通过以下代码,把opencv的Mat转换为QImage,然后在Qt的QLabel控件上进行显示
QImage qgrabImg = QImage((const unsigned char*)(grabImg.data), grabImg.cols, grabImg.rows, grabImg.cols*grabImg.channels(), QImage::Format_RGB888); // Mat为BGR颜色模式;
qgrabImg = qgrabImg.rgbSwapped();
ui->grabImg->setPixmap(QPixmap::fromImage(qgrabImg));
实际Qt程序运行效能
程序源码下载地址
地址: