• 海康威视监控相机的SDK与opencv调用(非工业相机)


    1.研究内容

    本篇主要对海康威视的监控相机的SDK回调进行研究,并于opencv结合,保存图像,以供后续其他处理,开发语言为C++

    2.步骤及方法

    2.1 海康SDK介绍

    海康SDK下载地址
    根据自身编译环境,下载对应的SDK,需要注意的是,不要和工业相机SDK相混淆,工业相机好像是MVS是什么玩意儿,现在暂时没研究
    在这里插入图片描述
    SDK包的结构如下,包括需要的头文件和库目录,其中windows下还提供了Demo示例,开发文档是我们时常需要用到的,结构如下:
    在这里插入图片描述
    其中SDK编程指南是需要注意的一个地方,通常需要根据自己的相机型号选择对应的文件,有些相机型号可能不支持,比如我使用的DS-2CD7********,这款相机,就只支持IPC的,查看文档是否支持相机,可以打开文档,在SDK简介中查看:
    在这里插入图片描述
    SDK文件确定后可以开始后续的开发了

    2.2 环境搭建

    打开visual studio 2022,配置sdk环境,包括前面提到的库文件和头文件,其中用到了opencv,配置opencv的相关头文件和库文件:
    在这里插入图片描述
    在这里插入图片描述
    配置方式不多说,也可以在VC++目录中添加
    添加完成后,编写头文件,蒋需用到的库包含进来,包括opencv的和海康sdk的:
    在这里插入图片描述
    其中有一个PlayM4.h头文件,sdk里面是没有的,需要在示例文件中拷贝过来,opencv如果是编译成一个opencv_world的,直接配置上去就行了

    2.3 相机配置

    海康相机配置比较容易,初始的IP地址是192.168.1.64,可以根据实际使用情况,修改相机的IP,登录的用户名和密码,sdk调用的时候需要用到这3个信息。

    2.4 SDK调用

    SDK取流在文档的第4章《函数调用示例》中,直接复制,粘贴,修改好自己相机的IP,用户名和密码就可以正常调用起来了,主要分为以下几个部分:
    (1)初始化
    初始化,包括设备注册,设置连接时间和重连时间,设置异常回调函数等,其中最重要的是设置登录相机设备的IP地址,用户名和密码。
    (2)调用相机
    调用相机有多种方式,可以直接使用rtsp取流,也可以直接使用海康sdk提供的回调取流函数,这一部分需要参考sdk开发文档,不只是代码示例,还有sdk提供的其他函数,可参考5《函数说明》,例如,我需要拿到图像后和opencv结合,那么需要拿到图像的数据,就需要用到以下接口了:
    在这里插入图片描述

    3 图像保存

    本篇主要解决的问题是,sdk拿到的图像通过opencv保存下来并且可以做其他操作,sdk中提供的参考示例用了一个Sleep函数,不是和符合我的要求,所以做了一些修改后面会提供整个代码工程,主要的改动如下:
    参考的sdk:
    在这里插入图片描述
    修改的部分

    //使用海康的SDK抓取图像
     HKSDK_LIB_API int __stdcall  playCapture(void* user,int count, Mat &save_image_l,Mat &save_image_r)
    {
    	//外部多线程使用
    	LPMyStruct stru = (LPMyStruct)user;
    
    	//启动预览并设置回调数据流
    	NET_DVR_PREVIEWINFO struPlayInfo = { 0 };
    	struPlayInfo.hPlayWnd = NULL;         //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
    	struPlayInfo.lChannel = stru->channel;       //预览通道号
    	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 = 1;       //0- 非阻塞取流,1- 阻塞取流
    
    	LPNET_DVR_JPEGPARA JpegPara = new NET_DVR_JPEGPARA;
    	JpegPara->wPicQuality = 0;
    	JpegPara->wPicSize = 70;
    	int w = 2560;
    	int h = 1440;
    	char* Jpeg = new char[w * h];
    	DWORD len = w * h;
    	LPDWORD Ret = 0;
    	if (!NET_DVR_SetCapturePictureMode(BMP_MODE))
    	{
    		cout << "Set Capture Picture Mode error!" << endl;
    		cout << "The error code is " << NET_DVR_GetLastError() << endl;
    	}
    	vector<char>data(w * h);
    	
    	bool capture = NET_DVR_CaptureJPEGPicture_NEW(stru->lUserId, struPlayInfo.lChannel, JpegPara, Jpeg, len, Ret);
    	if (!capture)
    	{
    		printf("Error: NET_DVR_CaptureJPEGPicture_NEW = %d", NET_DVR_GetLastError());
    		return -1;
    	}
    	for (int i = 0; i < w * h; i++)
    		data[i] = Jpeg[i];
    
    	if(stru->channel==1){
    		save_image_l = imdecode(Mat(data), 1);
    	}
    	if (stru->channel == 2) {
    		save_image_r = imdecode(Mat(data), 1);
    	}
    	
    	
    
    	
    
    	return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    此时save_image_r 表示的就是一个Mat了,主要修改包括:
    (1)LPNET_DVR_JPEGPARA
    从这一部分开始,和sdk提供的有所区别,主要用NET_DVR_CaptureJPEGPicture_NEW替换了NET_DVR_RealPlay_V40函数
    其中LPNET_DVR_JPEGPARA类提供了一些配置,包括图像大小,图像质量等。

    4 完整C++代码工程

    完整的代码工程点击头像获取资源,可以直接部署使用,我这里相机有两个通道图,所以拿到了两个图。

    5 参考

    [1] 海康威视SDK文档 https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10
    [2]https://blog.csdn.net/u013832707/article/details/103405278
    [3]https://blog.csdn.net/xiaojunjun200211/article/details/122237091

  • 相关阅读:
    日志开源组件(六)Adaptive Sampling 自适应采样
    Prometheus+Consul 自助服务发现
    我用shell脚本实现项目容器化自动部署
    python算法对音频信号处理Sonification :Gauss-Seidel迭代算法
    [附源码]计算机毕业设计美发店会员管理系统Springboot程序
    云备份——服务器业务处理模块以及网络通信模块
    Python画爱心——谁能拒绝用代码敲出会跳动的爱心呢~
    Web基础 - JavaScript
    【定义】二阶行列式
    分享使用百度EasyDL实现地质灾害预警
  • 原文地址:https://blog.csdn.net/llsplsp/article/details/134506570