MFC框架下-调通官方demo以及如何使用SDK进行项目开发

本系统使用海康威视摄像头作为视频源,并使用第三方离线SDK,对摄像头的数据进行人脸识别,从而达到报警,对比等功能。

要说明的一点:我们一定要站在巨人的肩膀上做项目开发,即要学会使用官方的SDK和各种第三方的代码,而不是自己从头去写一个算法。

  • 第一步:下载和使用虹软Demo

选择虹软官网的视觉开放平台开发者中心,登录后自己建立一个应用,点击添加SDK如图所示:
在这里插入图片描述
即可根据自己的编程语言和SDK版本号建立自己的SDK,点击下载即可:
在这里插入图片描述

  • 如何配置Demo(这里顺带着提一下动态链接库的知识,下面这句话很重要)

lib是编译时候用的,dll是运行要用的,所以只需要在exe文件所在的目录下放置dll文件即可,dll提供了相关函数和资源,dll搜索是首先从exe主目录搜索的,然后是windows系统目录和windows目录,最后是环境变量中的目录,这几个都可以,放到主目录很方便。

打开下载好的文件夹,按如下方式将上文件夹的内容复制到下文件夹里面(不同版本lib可能不同,需要手动移动)
在这里插入图片描述
另外就是头文件,上是官方给的,下是Demo自己的,将上部的文件粘贴替换掉下部的文件,目的同上:
在这里插入图片描述
接下来返回工程文件的根目录,找到.sln文件(双击.sln文件就可打开VS的工程文件),注意我们下载的是win32版本(x86),因此要选择win32,当然用debug还是release都是可以的:
在这里插入图片描述
点击本地windows调试器,可以运行demo,但同时会出现很多的错误(缺少很多很多的dll),点击调试器的原因是:
官方所给的demo是没有生成exe文件的,所以我们不知道他的文件夹是在哪,点击之后在工程文件目录里自动生成了一个debug文件夹,里面有exe文件,接下来就需要将dll文件放入exe文件所在的目录中 , 如图所示:
在这里插入图片描述
这些dll文件在工程文件夹中就可以找到,将其通通复制到debug文件夹下(包括opencv、FreeSdk、自身文件夹下的dll):在这里插入图片描述
在这里插入图片描述
然后双击exe文件或者点击VS下的本地windows调试器,这样就可以打开虹软的demo了。但这并没有算完,尝试去识别一个人脸发现并不能做到,这个时候就需要在代码里面配置一下。
在这里插入图片描述
打开对话框的.cpp文件,下拉寻找初始化的消息处理程序,有app的ID,sdk的Key,如图所示:
在这里插入图片描述
虹软的SDK必须要有这两个东西而且电脑必须是联网的,用来去激活虹软的引擎,当然第一次激活的时候是需要联网的,激活完成后就不需要联网了,这两个东西就在虹软的官网上:
在这里插入图片描述
填完ID和Key之后还需将ReadSetting这行代码给注释掉,该行代码是用于读取本地配置文件的,正常情况下可从上面定义的一系列字符中修改参数,不需要读取。接下来再点击本地Windows调试,即可正常运行:
在这里插入图片描述

  • 第二步:下载和使用海康威视Demo

进入海康威视官网,选择SDK开发,选择兼容性较好的32位平台SDK下载,另外我们需要查找连接电脑的摄像头的IP和端口,还需下载一个工具软甲,点击下载安装即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接下来的步骤和虹软SDK步骤一样,解压海康SDK,随便选择其中的一个Demo,下图是解压后的文件夹和其中一个Demo的工程文件(下),现在所要做的便是将Dll文件放在exe所在的文件夹里。
在这里插入图片描述
复制完后,此时点击exe文件就可以正常运行了,想要正确连接海康的摄像头读出视频数据六,只需从刚才海康的软件中读取到设备的IP和端口,输入到Demo中即可。
在这里插入图片描述
在这里插入图片描述

  • 第三步:从零开始做一个自己的人脸识别项目(海康SDK)

①首先建立一个MFC工程,把所有系统默认勾选的样式和高级功能全部去掉:
在这里插入图片描述
②配置项目属性:可执行文件的输出目录和头文件、库文件的输出目录。点击解决方案资源管理器,右键项目名称选择属性,选择输出目录,选择浏览,默认的是刚才新建的工程文件的文件夹,那么可以新建一个文件夹取名bin,用来存储可执行文件,选择该文件夹,可以看到是一个相对的路径。
在这里插入图片描述
在这里插入图片描述
在选择VC++目录,包含目录就是头文件所在的目录,选择编辑,新建一个文件夹,取名为include,点击确定后可以看到是一个绝对路径,把前面的全部删除掉。换成点,变成一个相对的路径(注意这点很重要),
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
还有一个库文件目录的配置:同样点击编辑,新建,浏览,在项目文件中新建一个文件夹取名为lib(也就是library),同样点击确定后将绝对路径改为相对路径,这样就算全部做完了项目属性的配置。
在这里插入图片描述
移动头文件、库文件和DLL文件:接下来就是要将一系列头文件、库文件、DLL文件配置到工程目录中对应的文件夹当中。打开已经下载好的海康Demo,将其头文件夹中的文件拷贝到我们项目的include文件夹中,另外在MFC工程文件中本身也自带了一些.h头文件,为了美观期间我们将其也拷贝(剪切)到include文件夹中,如下图所示:
在这里插入图片描述
在这里插入图片描述
再将可执行程序所有的dll文件放入到bin文件当中(虽然有的不一定用得到,但不代表以后其他的demo用不到),打开海康demo的库文件文件夹,复制包含dll文件的文件夹和文件。在这里插入图片描述
最后配置库文件:海康的库文件和dll文件全部在名字为库文件的文件夹中,把其中的lib文件复制到项目文件的lib文件夹中:
在这里插入图片描述

此时此刻,函数api还是不可以使用的,因为还没有添加依赖性,这个附加依赖项在属性的链接器输入中。

编辑附加依赖项,需要手动的将刚才所添加的库文件(lib文件)的文件名复制粘贴进来,如图所示:
在这里插入图片描述
④将头文件先移除再添加,因为刚才移动了头文件,更新一下方便查看。千万不能删除,是移除。
⑤代码移植。
在VS中选择Dlg.cpp文件,里面包括了一些初始化函数及一些简单的操作,如绘制对话框OnPaint(),初始化OnInitDialog()等。下面就是要通过代码来配置摄像头达到预览的目的,这些代码就需要从官网的SDK中找。

打开官方的文件夹,选择开发文档,选择设备网络SDK使用手册,里面有很多示例的代码,但我们所需要的仅仅是一小部分。选择我们所需要的功能(实时预览),如下图所示:
在这里插入图片描述
接下来说说如何结合SDK做我们自己的项目(由于为了说明简单,没有额外的控件,因此所有的设备初始化代码全部在对话框初始化函数中进行):根据示例代码,首先我们应该包含一个头文件,复制#include "HCNetSDK.h"到Dlg.cpp文件中,接下来第一步是初始化,在初始化函数OnInitDialog()中添加代码:NET_DVR_Init();接着复制注册设备的一段代码到我们自己的项目中,当然其中的IP地址和端口,用户名密码等都需要修改,这些都可以在海康自带的软件中查看。第三步就是启动预览并设置回调数据流,将整个代码段复制到我们的项目中。
在这里插入图片描述
其中有一个获取窗口句柄的代码,其意思是:从摄像头获取的视频流显示到哪一个控件里。当然这个时候就需要在对话框里添加一个控件,在主对话框中添加picture control控件,用于显示预览图像,右键属性获取其ID,再通过修改SDK语句为:HWND hWnd = GetDlgItem(IDD_MFCAPPLICATION1_DIALOG)->m_hWnd; 获取其句柄。注意SDK函数中return是空值,而初始化函数返回的是布尔类型的值,因此需要将return改为return TRUE,return TRUE的意思就是让用户来做主,最后点击本地Windows调试器即可运行程序。

整个海康威视摄像头的初始化代码如下,当然如果想要在主对话框中添加编辑框来输入IP端口用户名等很多内容,从而不必将整个代码放入初始化当中:

BOOL CMFCApplication1Dlg::OnInitDialog()
{
    
    
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	// 初始化
	NET_DVR_Init();
	//---------------------------------------
	// 注册设备
	LONG lUserID;
	//登录参数,包括设备地址、登录用户、密码等
	NET_DVR_USER_LOGIN_INFO struLoginInfo = {
    
     0 };
	struLoginInfo.bUseAsynLogin = 0; //同步登录方式
	strcpy(struLoginInfo.sDeviceAddress, "10.13.35.229"); //设备IP地址
	struLoginInfo.wPort = 8000; //设备服务端口
	strcpy(struLoginInfo.sUserName, "admin"); //设备登录用户名
	strcpy(struLoginInfo.sPassword, "abcd1234"); //设备登录密码
												 //设备信息, 输出参数
	NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {
    
     0 };

	lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
	if (lUserID < 0)
	{
    
    
		printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
		NET_DVR_Cleanup();
		return TRUE;
	}
	//启动预览并设置回调数据流
	LONG lRealPlayHandle;
	HWND hWnd = GetDlgItem(IDD_MFCAPPLICATION1_DIALOG)->m_hWnd;     //获取窗口句柄
	NET_DVR_PREVIEWINFO struPlayInfo = {
    
     0 };
	struPlayInfo.hPlayWnd = hWnd;         //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
	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 = 1;       //0- 非阻塞取流,1- 阻塞取流
	lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, NULL, NULL);
	if (lRealPlayHandle < 0)
	{
    
    
		printf("NET_DVR_RealPlay_V40 error\n");
		NET_DVR_Logout(lUserID);
		NET_DVR_Cleanup();
		return TRUE;
	}
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
  • 第四步:从零开始做一个自己的人脸识别项目(虹软SDK)

①导入相关文件,首先将虹软的头文件文件夹放入项目的include文件夹中,为了统一期间再将项目文件中的头文件剪切到inc(include)文件夹中,opencv的文件夹不用改动。
在这里插入图片描述
再导入库文件,虹软将库文件已经做成了两个文件夹,直接复制到项目的lib文件夹中即可,即使这两个文件夹中有dll,关系不大:
在这里插入图片描述
最后导入dll文件,将其放在项目的exe文件夹的目录中(bin文件夹),一步一步寻找,不要有落下的,如图:
在这里插入图片描述
在这里插入图片描述
②项目属性配置,包含目录,库目录和附加依赖项的配置分别如下所示,为什么这样配置前面已经讲过。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③移植代码,首先用Notepad++打开虹软demo中的samplecode,首先将其众多头文件复制到Dlg.cpp文件中,如图:
在这里插入图片描述

在这里插入图片描述
再将命名空间和所需要的函数复制到Dlg.cpp文件中,如图,当然还需要将对应的APPID和SDKKEY修改。
在这里插入图片描述
下面在初始化函数OnInitDialog()中配置虹软工程:在之前已经配置好的海康代码下部开始配置虹软所需的SDK,将从main函数开始的示例demo全部复制到初始化函数中即可。

注意修改为多字符集,否则遇到字符串会报错。

在这里插入图片描述
整体上已经说的很详细了,接下来会开发一个双光摄像测温功能的软件,随后会更新博文。

猜你喜欢

转载自blog.csdn.net/qq_42308217/article/details/112440499