拌合楼管理系统(八) c#海康威视摄像头车牌识别

前言: c#调用海康威视SDK实现车牌识别

        原本以为海康威视sdk的Demo里面没有车牌识别的实例,后来发现自己肤浅了,官方是有提供的,只是车牌识别是通过安防布警的方式实现的.程序主动监听,触发告警后获取到车牌信息.


一、接口调用的流程:    

        首先初始化sdk   ->  开始监听包进上传->停止监听报警上传->释放SDK资源, 过程比较简单,官方文档中的流程图如下,虚线框的内容是可选的,设备事先安装配置好,登录、能力集和配置接口可不调用,不会影响其他接口功能的使用。

二、车牌警告类型:

        车牌上传的报警类型(lCommand)有COMM_ITS_PLATE_RESULT(0x3050)和COMM_PLATE_RESULT_V50(0x3063) 两种:当lCommand为COMM_ITS_PLATE_RESULT时,pAlarmInfo对应报警信息结构体为:NET_ITS_PLATE_RESULT;当lCommand为COMM_PLATE_RESULT_V50时,pAlarmInfo对应的报警信息结构体为: NET_DVR_PLATE_RESULT_V50

三、监控设置告警服务器地址:

        需要配置报警服务器的IP和端口,这个再下面代码里面是需要用到的。

四、代码实现:

        1. copy 库文件到生成程序目录,以及官方提供的CHCNetSDK.cs拷贝到项目下。如之前的调用接口拍照过程。

        2.   一些属性和方法委托的定义

   private Int32 m_lUserID = -1;private Int32[] m_lAlarmHandle = new Int32[200];private Int32 iListenHandle = -1; private int iDeviceNumber = 0; //添加设备个数private int iFileNumber = 0; //保存的文件个数private uint iLastErr = 0;private string strErr;public CHCNetSDK.LOGINRESULTCALLBACK LoginCallBack = null;private CHCNetSDK.EXCEPYIONCALLBACK m_fExceptionCB = null;private CHCNetSDK.MSGCallBack_V31 m_falarmData_V31 = null;private CHCNetSDK.MSGCallBack m_falarmData = null;public delegate void UpdateTextStatusCallback(string strLogStatus, IntPtr lpDeviceInfo);public delegate void UpdateListBoxCallback(string strAlarmTime, string strDevIP, string strAlarmMsg);public delegate void UpdateListBoxCallbackException(string strAlarmTime, int lUserID, string strAlarmMsg);CHCNetSDK.NET_VCA_TRAVERSE_PLANE m_struTraversePlane = new CHCNetSDK.NET_VCA_TRAVERSE_PLANE();CHCNetSDK.NET_VCA_AREA m_struVcaArea = new CHCNetSDK.NET_VCA_AREA();CHCNetSDK.NET_VCA_INTRUSION m_struIntrusion = new CHCNetSDK.NET_VCA_INTRUSION();CHCNetSDK.UNION_STATFRAME m_struStatFrame = new CHCNetSDK.UNION_STATFRAME();CHCNetSDK.UNION_STATTIME m_struStatTime = new CHCNetSDK.UNION_STATTIME();

        3.  类的构造函数中初始化SDK:

 bool m_bInitSDK = CHCNetSDK.NET_DVR_Init();if (m_bInitSDK == false){MessageBox.Show("NET_DVR_Init error!");return;}else{byte[] strIP = new byte[16 * 16];uint dwValidNum=0;Boolean bEnableBind=false;//获取本地PC网卡IP信息if (CHCNetSDK.NET_DVR_GetLocalIP(strIP, ref dwValidNum, ref bEnableBind)){if (dwValidNum > 0){//取第一张网卡的IP地址为默认监听端口textBoxListenIP.Text = System.Text.Encoding.UTF8.GetString(strIP, 0, 16);//CHCNetSDK.NET_DVR_SetValidIP(0,true); //绑定第一张网卡}}//保存SDK日志 To save the SDK logCHCNetSDK.NET_DVR_SetLogToFile(3, "C:\\SdkLog\\", true);//设置透传报警信息类型CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struLocalCfg = new CHCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();struLocalCfg.byAlarmJsonPictureSeparate = 1;//控制JSON透传报警数据和图片是否分离,0-不分离(COMM_VCA_ALARM返回),1-分离(分离后走COMM_ISAPI_ALARM回调返回)Int32 nSize = Marshal.SizeOf(struLocalCfg);IntPtr ptrLocalCfg = Marshal.AllocHGlobal(nSize);Marshal.StructureToPtr(struLocalCfg, ptrLocalCfg, false);if (!CHCNetSDK.NET_DVR_SetSDKLocalCfg(17, ptrLocalCfg))  //NET_DVR_LOCAL_CFG_TYPE_GENERAL{iLastErr = CHCNetSDK.NET_DVR_GetLastError();strErr = "NET_DVR_SetSDKLocalCfg failed, error code= " + iLastErr;MessageBox.Show(strErr);}Marshal.FreeHGlobal(ptrLocalCfg);for (int i = 0; i < 200; i++){m_lAlarmHandle[i] = -1;}//设置异常消息回调函数if (m_fExceptionCB == null){m_fExceptionCB = new CHCNetSDK.EXCEPYIONCALLBACK(cbExceptionCB);}CHCNetSDK.NET_DVR_SetExceptionCallBack_V30(0, IntPtr.Zero, m_fExceptionCB, IntPtr.Zero);//设置报警回调函数if (m_falarmData_V31 == null){m_falarmData_V31 = new CHCNetSDK.MSGCallBack_V31(MsgCallback_V31);}CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(m_falarmData_V31, IntPtr.Zero);}

        4.  绑定网卡监听:

    string sLocalIP = textBoxListenIP.Text;ushort wLocalPort = ushort.Parse(textBoxListenPort.Text);if (m_falarmData==null){m_falarmData = new CHCNetSDK.MSGCallBack(MsgCallback);}iListenHandle = CHCNetSDK.NET_DVR_StartListen_V30(sLocalIP, wLocalPort, m_falarmData, IntPtr.Zero);if (iListenHandle < 0){iLastErr = CHCNetSDK.NET_DVR_GetLastError();strErr = "启动监听失败,错误号:" + iLastErr; //撤防失败,输出错误号MessageBox.Show(strErr);}else{MessageBox.Show("成功启动监听!");btnStopListen.Enabled = true;btnStartListen.Enabled = false;}

        5.  接收事件,将事件写入到list中   

    private void ProcessCommAlarm_ISAPIAlarm(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser){CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO struISAPIAlarm = new CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO();uint dwSize = (uint)Marshal.SizeOf(struISAPIAlarm);struISAPIAlarm = (CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_DVR_ALARM_ISAPI_INFO));//报警设备IP地址string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');//保存XML或者Json数据string str = "";if ((struISAPIAlarm.dwAlarmDataLen != 0) && (struISAPIAlarm.pAlarmData != IntPtr.Zero)){  if (struISAPIAlarm.byDataType == 1) // 0-invalid,1-xml,2-json{str = ".\\picture\\ISAPI_Alarm_XmlData_[" + strIP + "]_lUerID_[" + pAlarmer.lUserID + "]_" + iFileNumber + ".xml";}if (struISAPIAlarm.byDataType == 2) // 0-invalid,1-xml,2-json{str = ".\\picture\\ISAPI_Alarm_JsonData_[" + strIP + "]_lUerID_[" + pAlarmer.lUserID + "]_" + iFileNumber + ".json";}FileStream fs = new FileStream(str, FileMode.Create);int iLen = (int)struISAPIAlarm.dwAlarmDataLen;byte[] by = new byte[iLen];Marshal.Copy(struISAPIAlarm.pAlarmData, by, 0, iLen);fs.Write(by, 0, iLen);fs.Close();iFileNumber++;}for (int i = 0; i < struISAPIAlarm.byPicturesNumber; i++){CHCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA struPicData = new CHCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA();struPicData.szFilename = new byte[256];Int32 nSize = Marshal.SizeOf(struPicData);struPicData = (CHCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA)Marshal.PtrToStructure((IntPtr)((Int64)(struISAPIAlarm.pPicPackData) + i * nSize), typeof(CHCNetSDK.NET_DVR_ALARM_ISAPI_PICDATA));//保存图片数据if ((struPicData.dwPicLen != 0) && (struPicData.pPicData != IntPtr.Zero)){                 str = ".\\picture\\ISAPI_Alarm_Pic_[" + strIP + "]_lUerID_[" + pAlarmer.lUserID + "]_"+ "_" + iFileNumber + ".jpg";FileStream fs = new FileStream(str, FileMode.Create);int iLen = (int)struPicData.dwPicLen;byte[] by = new byte[iLen];Marshal.Copy(struPicData.pPicData, by, 0, iLen);fs.Write(by, 0, iLen);fs.Close();iFileNumber++;}}string stringAlarm = "ISAPI报警信息,byDataType:" + struISAPIAlarm.byDataType + ",图片张数:" + struISAPIAlarm.byPicturesNumber;if (InvokeRequired){object[] paras = new object[3];paras[0] = DateTime.Now.ToString(); //当前PC系统时间paras[1] = strIP;paras[2] = stringAlarm;listViewAlarmInfo.BeginInvoke(new UpdateListBoxCallback(UpdateClientList), paras);}else{//创建该控件的主线程直接更新信息列表 UpdateClientList(DateTime.Now.ToString(), strIP, stringAlarm);}}public void UpdateClientList(string strAlarmTime, string strDevIP, string strAlarmMsg){//列表新增报警信息listViewAlarmInfo.Items.Add(new ListViewItem(new string[] { strAlarmTime, strDevIP, strAlarmMsg }));}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLiteC/C++接口详细介绍sqlite3_stmt类(四)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;三&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;五&#xff09; 7. sqlite3_bind_parameter_count函数 sqlite3_bind_param…

流畅的 Python 第二版(GPT 重译)(十一)

第二十章&#xff1a;并发执行器 抨击线程的人通常是系统程序员&#xff0c;他们心中有着典型应用程序员终其一生都不会遇到的用例。[…] 在 99%的用例中&#xff0c;应用程序员可能会遇到的情况是&#xff0c;生成一堆独立线程并将结果收集到队列中的简单模式就是他们需要了解…

Java newInstance方法学习

用newInstance与用new是有区别的&#xff0c;区别在于创建对象的方式不一样&#xff0c;前者是使用类加载机制&#xff1b; newInstance方法要求该 Class 对应类有无参构造方法&#xff1b; 执行 newInstance()方法实际上就是使用对应类的无参构造方法来创建该类的实例&#x…

YOLOV4-车道线检测-车距离预测

1.前言 最近在看华为的CANN框架&#xff0c;发现了一些很有意思的开源算法(本文所有的代码都出自华为开源git发布的代码)&#xff0c;华为最近出了AI PRO开发板&#xff0c;想着现在开发板上用用(不想重新配置环境了&#xff0c;麻烦还累)&#xff0c;看着代码有onnx的模型&…

绝地求生:PUBG延长GPU崩溃时间新方法

相信大家都在被GPU游戏崩溃苦恼已久&#xff0c;PUBG这个游戏崩溃&#xff0c;跟超频是没有多大关系的&#xff0c;只要超频TM5过测&#xff0c;YC过测&#xff0c;或者双烤过测&#xff0c;就没问题。主要是这个游戏的优化不行&#xff0c;特别40系显卡&#xff0c;对内存条也…

免费AI出图神器:StableStudio——定义AI作画新前景

StableStudio&#xff1a;探索艺术与科技的无限交界&#xff0c;StableStudio引领AI智能创作新浪潮&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 ChatGPT大语言模型AI的诞生引爆了对AIGC的讨论。AIGC 又称生成式 AI (Generative AI)&#xff0c;是继专业生产内容&…

Python 全栈体系【四阶】(十七)

第五章 深度学习 一、基本理论 3. 深度神经网络训练法则 3.1 损失函数 3.1.1 什么是损失函数&#xff1f; 损失函数&#xff08;Loss Function&#xff09;&#xff0c;也有称之为代价函数&#xff08;Cost Function&#xff09;&#xff0c;用来度量预测值和实际值之间的差…

html5cssjs代码 029 CSS计数器

html5&css&js代码 029 CSS计数器 一、代码二、解释 该HTML代码定义了一个网页的结构和样式。在头部&#xff0c;通过CSS样式定义了body和h1-h2元素的样式。body元素的样式包括文本居中、计数器重置、字体颜色和背景颜色。h2元素的样式使用了CSS计数器来自动在标题前添加…

RIDE控制台中文显示为乱码问题解决方案【版本1.7.4.1】

1、方法&#xff1a; 将 C:\Users\user_name\AppData\Roaming\Python\Python37\site-packages\robotide\contrib\testrunner\testrunnerplugin.py文件中的第80行修改&#xff0c;改为utf-8 2、修改代码位置&#xff1a; 3、效果&#xff1a; 4、参考文章 试了前面的方法没有…

Python 深度学习第二版(GPT 重译)(一)

前言 序言 如果你拿起这本书&#xff0c;你可能已经意识到深度学习在最近对人工智能领域所代表的非凡进步。我们从几乎无法使用的计算机视觉和自然语言处理发展到了在你每天使用的产品中大规模部署的高性能系统。这一突然进步的后果几乎影响到了每一个行业。我们已经将深度学…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的&#xff1f;内存是如何分配的&#xff1f;所以我们得知道如何计算结构体的大小&#xff1f;这就引出了我们今天所要探讨的内容&#xff1a;结构体内存对齐。 1.1 对齐规…

【Redis】Redis常见原理和数据结构

Redis 什么是redis redis是一款基于内存的k-v数据结构的非关系型数据库&#xff0c;读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 redis的数据类型 string&#xff1a;字符串 缓存对象&#xff0c;分布式ID&#xff0c;token&#xff0c;se…

1236 - 二分查找

代码 #include<bits/stdc.h> using namespace std; int a[1100000]; int main() {int n,x,l,r,p,mid,i;cin>>n;for(i1;i<n;i)cin>>a[i];cin>>x;l1;rn;p-1;while(l<r){mid(rl)/2;if(a[mid]x){pmid;break;}else if(x<a[mid]) rmid-1;else if(x…

微软聘请了谷歌DeepMind的联合创始人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

​HTTP与HTTPS:网络通信的安全卫士

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; ✨✨ 帅哥美女们&#xff0c;我们共同加油&#xff01;一起进步&am…

【高并发服务器 01】—— 基础知识回顾

接下来四周时间&#xff0c;我将会做一个高并发服务器相关的项目。 前置知识&#xff1a;操作系统系统编程、网络编程、基础的数据结构、C语言。 开发环境&#xff1a;VMware虚拟机&#xff1a;Ubuntu 20.04.6 LTS、vscode 今天先回顾一些基础知识。 1.文件与IO 标准IO&#…

Windows下hydra(海德拉/九头蛇)暴力猜解RDP的简单渗透实践

attscker machine&#xff1a;windows10 靶机&#xff1a;windoes server 2003 环境&#xff1a;网络可达 && mstsc开启 hydra字典&#xff1a; 123456 123admin admin123 123Com&#xff08;正确密码&#xff09; 进入hydra目录&#xff0c;字典与hydar.exe同一目录…

MySQL分组查询与子查询 + MySQL表的联结操作

目录 1 MySQL分组查询与子查询 1.1 数据分组查询 1.2 过滤分组 1.3 分组结果排序 1.4 select语句中子句的执行顺序 1.5 子查询 2 MySQL表的联结操作 2.1 关系表 2.2 表联结 2.3 笛卡尔积 2.4 内部联结 2.5 外联结 2.6 自联结 2.7 组合查询 1 MySQL分组查询与子查询…

Python 解析json文件 使用Plotly绘制地理散点图

目录 0、任务说明 1、解析json文件 2、使用Plotly绘制地理散点图 2.1 函数scatter_geo介绍 2.2 官方示例 3、根据json文件数据&#xff0c;准备绘制地理散点图的‘数据结构’ 4、完整代码及运行效果 0、任务说明 json文件中存放了关于地震的地理信息。 使用plotly模块…

Java柠檬班Java全栈自动化课程

Java柠檬班Java全栈自动化课程旨在教授学员Java编程技能与全栈开发知识&#xff0c;包括自动化测试、前端开发和后端开发。学员将学习如何构建完整的应用程序&#xff0c;并掌握自动化测试框架&#xff0c;为职业发展打下坚实基础。 课程大小&#xff1a;14G 课程下载&#x…