调用海康威视sdk获取车牌号

环境: win10(10.0.16299.0)+ vs2017
sdk版本:CH-HCNetSDK_Win32_V5.3.2.15_build20171122
https://download.csdn.net/download/cngwj/10307129(工程已包含sdk下载后可直接运行)

1、首先确认摄像头是否支持车辆检测

调用海康威视sdk获取车牌号_第1张图片

2、 启用事件抓图

调用海康威视sdk获取车牌号_第2张图片

3、配置sdk

        下载sdk http://www.hikvision.com/cn/download_61.html

    调用海康威视sdk获取车牌号_第3张图片


4、运行效果图

调用海康威视sdk获取车牌号_第4张图片



/************************************************************************
* Copyright(c) 2018
*
* File:		报警布防_0.3.c
* Brief:	调用海康威视sdk获取车牌号
* Version: 	0.3
* Author: 	一念无明
* Email:	[email protected]
* Date:    	2018.02.26
* History:
2018.2.26 	调用海康威视sdk获取车牌号
2018.3.7 	获取设备系统时间
2018.3.12   保存车牌号到csv文件
2018.3.14	对识别到的车牌号进行白名单比对

************************************************************************/
//-------------------------------------------------------------------------
//头文件

#include 
#include 
#include  
#include 
#include  
#include "Windows.h"
#include "HCNetSDK.h"
#include 
#include //getch()函数用

using namespace std;


//参数声明
int iNum = 0; 	//图片名称序号
LONG IUserID;	//摄像机设备
LONG IHandle = -1;//报警布防/撤防;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;	//设备信息


char sDVRIP[20];	//抓拍摄像机设备IP地址
short wDVRPort = 8000;	//设备端口号
char sUserName[20];	//登录的用户名
char sPassword[20];	//用户密码
string carNum;//车牌号							
string LineByLine;//逐行读取文件 


				  //---------------------------------------------------------------------------------
				  //函数声明
void Init();//初始化
void Demo_SDK_Version(); //获取sdk版本
void Connect();//设置连接事件与重连时间
void Htime();//获取海康威视设备时间
bool Login(char *sDVRIP, short wDVRPort, char *sUserName, char *sPassword);//注册摄像机设备
void CALLBACK MSesGCallback(LONG ICommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void *pUser);//报警回调函数
void SetMessageCallBack();//设置报警回调函数
void Whitelist();//白名单比对
void Blacklist();//黑名单比对
void SetupAlarm();//报警布防
void CloseAlarm();//报警撤防
void OnExit(void);//退出
				  //---------------------------------------------------------------------------------------------------
				  //函数定义
				  //初始化
void Init()
{
	//获取系统时间
	SYSTEMTIME sys;
	GetLocalTime(&sys);
	cout << sys.wYear << "-" << sys.wMonth << "-" << sys.wDay << " " << sys.wHour << ":" << sys.wMinute << ":" << sys.wSecond << endl;

	cout << "IP:";
	cin >> sDVRIP; cout << endl;
	cout << "用户名:";
	cin >> sUserName; cout << endl;
	cout << "密码:";
	char c;
	for (int i = 0; (c = _getch()) != '\r'; i++) {
		sPassword[i] = c;
		putchar('*');
	}
	cout << endl;

	NET_DVR_Init();//初始化
	Demo_SDK_Version();//获取 SDK  的版本号和 build  信息	
}

//设置连接事件与重连时间
void Connect()
{
	NET_DVR_SetConnectTime(2000, 1);
	NET_DVR_SetReconnect(10000, true);
}
//获取海康威视设备时间
void Htime() {
	bool iRet;
	DWORD dwReturnLen;
	NET_DVR_TIME struParams = { 0 };

	iRet = NET_DVR_GetDVRConfig(IUserID, NET_DVR_GET_TIMECFG, 1, \
		&struParams, sizeof(NET_DVR_TIME), &dwReturnLen);
	if (!iRet)
	{
		printf("NET_DVR_GetDVRConfig NET_DVR_GET_TIMECFG  error.\n");
		NET_DVR_Logout(IUserID);
		NET_DVR_Cleanup();
	}



	printf("%d年%d月%d日%d:%d:%d\n", struParams.dwYear, struParams.dwMonth, struParams.dwDay, struParams.dwHour, struParams.dwMinute, struParams.dwSecond);
}

//注册摄像机设备
bool Login(char *sDVRIP, short wDVRPort, char *sUserName, char *sPassword)
{
	IUserID = NET_DVR_Login_V30(sDVRIP, wDVRPort, sUserName, sPassword, &struDeviceInfo);

	if (IUserID < 0)
	{
		std::cout << "Login Failed! Error number:" << NET_DVR_GetLastError() << std::endl;
		NET_DVR_Cleanup();
		return false;
	}
	else
	{
		std::cout << "Login Successfully!" << std::endl;
		return true;
	}

}

//Demo_SDK_Version()海康威视sdk版本获取函数
void Demo_SDK_Version()
{
	unsigned int uiVersion = NET_DVR_GetSDKBuildVersion();

	char strTemp[1024] = { 0 };
	sprintf_s(strTemp, "HCNetSDK V%d.%d.%d.%d\n", \
		(0xff000000 & uiVersion) >> 24, \
		(0x00ff0000 & uiVersion) >> 16, \
		(0x0000ff00 & uiVersion) >> 8, \
		(0x000000ff & uiVersion));
	printf(strTemp);
}

//定义异常消息回调函数
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
	char tempbuf[256] = { 0 };
	switch (dwType)
	{
	case EXCEPTION_RECONNECT:    //预览时重连  
		printf("----------reconnect--------%d\n", time(NULL));
		break;
	default:
		break;
	}
}


//报警回调函数
void CALLBACK MSesGCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
{

	ofstream oFile;//定义文件输出流
	oFile.open("车牌号.csv", ofstream::app);    //打开要输出的文件 	
											 //获取系统时间
	SYSTEMTIME sys;
	GetLocalTime(&sys);
	cout << sys.wYear << "-" << sys.wMonth << "-" << sys.wDay << " " << sys.wHour << ":" << sys.wMinute << ":" << sys.wSecond << endl;

	int i = 0;
	char filename[100];
	FILE *fSnapPic = NULL;
	FILE *fSnapPicPlate = NULL;
	//以下代码仅供参考,实际应用中不建议在该回调函数中直接处理数据保存文件,
	//例如可以使用消息的方式(PostMessage)在消息响应函数里进行处理。
	switch (lCommand) {
		//交通抓拍结果(老报警消息)
	case COMM_UPLOAD_PLATE_RESULT: {
		NET_DVR_PLATE_RESULT struPlateResult = { 0 };
		memcpy(&struPlateResult, pAlarmInfo, sizeof(struPlateResult));
		printf("车牌号: %s\n", struPlateResult.struPlateInfo.sLicense);//车牌号		
																	// oFile << struPlateResult.struPlateInfo.sLicense << endl;//保存车牌号到csv文件		
		oFile << struPlateResult.struPlateInfo.sLicense << "," << sys.wYear << "-" << sys.wMonth << "-" << sys.wDay << " " << sys.wHour << ":" << sys.wMinute << ":" << sys.wSecond << endl;//保存车牌号到csv文件	
																																															//场景图
		if (struPlateResult.dwPicLen != 0 && struPlateResult.byResultType == 1)
		{
			sprintf(filename, "./pic/%s.jpg", struPlateResult.struPlateInfo.sLicense);
			fSnapPic = fopen(filename, "wb");
			fwrite(struPlateResult.pBuffer1, struPlateResult.dwPicLen, 1, fSnapPic);
			iNum++;
			fclose(fSnapPic);
		}
		//车牌图
		if (struPlateResult.dwPicPlateLen != 0 && struPlateResult.byResultType == 1)
		{
			sprintf(filename, "./pic/1/%s.jpg", struPlateResult.struPlateInfo.sLicense);
			fSnapPicPlate = fopen(filename, "wb");
			fwrite(struPlateResult.pBuffer1, struPlateResult.dwPicLen, 1, fSnapPicPlate);
			iNum++;
			fclose(fSnapPicPlate);
		}
		//其他信息处理......
		break;
	}
								   //交通抓拍结果(新报警消息)
	case COMM_ITS_PLATE_RESULT: {
		NET_ITS_PLATE_RESULT struITSPlateResult = { 0 };
		memcpy(&struITSPlateResult, pAlarmInfo, sizeof(struITSPlateResult));
		for (i = 0; i



你可能感兴趣的:(调用海康威视sdk获取车牌号)