拌合楼管理系统(八) 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 log
     CHCNetSDK.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 }));
    }

  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

袁志佳:前端全栈工程师精英班

教程介绍 本套课程涵盖大前端的全部领域&#xff0c;并对传统的Web前端全栈深入教学。如利用前端知识开发 AI、VR、AR、iOS、Android、PC、Server、智能硬件。 同时我们将核心打造 JavaScript语言新发展、Vue源码分析、前端持续集成方案汇总、MV*框架深度分析 、前端图形学、N…

亚稳态及其解决办法

异步电路 亚稳态 亚稳态亚稳态的产生原因什么是同步异步信号怎么消除亚稳态 亚稳态 在数字电路中&#xff0c;每一位数据不是1&#xff08;高电平&#xff09;就是0&#xff08;低电平&#xff09;。当然对于具体的电路来说&#xff0c;并非1&#xff08;高电平&#xff09;就是…

elementary OS7 Ubuntu 22.04中硬盘挂载报错

elementary OS7 Ubuntu 22.04中硬盘挂载报错 背景目标思路解决方法 背景 上周末安装elementaryos7的过程中将windows10的引导文件搞丢了&#xff0c;这两天准备修复一下&#xff0c;保险期间将固态硬盘上的文件备份到移动硬盘上&#xff0c;备份过程中出现报错的问题&#xff…

2024常用Web支付开发讲解教程

课程介绍 本教程为web支付开发&#xff0c;讲解了最常用的两钟支付&#xff1a;支付宝支付和微信支付&#xff0c;服务器配置和API对接&#xff0c;学完本课程可以学会微信支付、和支付宝支付开发。 学习资料 链接&#xff1a;https://pan.baidu.com/s/19WarLP2dO4dFvNbIHLU…

C++类的6个默认成员函数(构造)

C类和对象基础-CSDN博客https://blog.csdn.net/lh11223326/article/details/136834917?spm1001.2014.3001.5501 目录 1.构造函数 概念 特性 2.析构函数 概念 特性 3.拷贝构造函数 概念 特征 4.赋值运算符重载&#xff08;构造实现&#xff09; 运算符重载 赋值运算…

【常见BUG系列】Java 编程中的 NoSuchFieldError 异常:原因与解决方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

云原生(五)、Docker-Swarm集群

基础环境说明 1、环境准备 1、启动4台服务器&#xff08;在同一个网段内&#xff09;。 2、重命名4台服务器&#xff0c;方便区分。 hostnamectl set-hostname swarm1 reboot安装docker。参考文章&#xff1a;云原生&#xff08;二&#xff09;、Docker基础 2、DockerSwarm…

Autosar Crypto Interface学习笔记

文章目录 前言Functional specificationError classificationError detection API specificationType DefinitionsFunction definitionsGeneral APICryIf_InitCryIf_GetVersionInfo Job Processing InterfaceCryIf_ProcessJobDispatch Key IDs匹配KeyId Job Cancellation Inter…

springcloud-Nacos 更强大的注册中心组件

Nacos 实际上从设计思想来说 Eureka 和 nacos 是一样的。 后者是Alibaba推出的 一款更强大 功能更丰富的注册中心 你可以理解为Eureka的高配版 技多不压身既然了解了 Eureka, nacos也来学习一下吧&#xff01; 安装 首先nacos不像eureka 直接pom里面引个依赖就搞定了&#…

odoo17开发教程(17):美化UI界面

从业务角度来看&#xff0c;我们的房地产模块现在很有意义。我们创建了特定的视图&#xff0c;添加了几个操作按钮和约束条件。不过&#xff0c;我们的用户界面还有些粗糙。我们希望在列表视图中添加一些颜色&#xff0c;并使一些字段和按钮有条件地消失。例如&#xff0c;&quo…

Webman全局异常捕获处理

最近在使用webman这个框架做项目开发&#xff0c;涉及到需要统一处理异常捕获。由于官网给的并不详细&#xff0c;于是自己实现了一下全局异常处理类。 一、配置效果 例如&#xff1a;我要在项目中统一返回json 格式数据&#xff0c;并不想在业务层写try,catch逻辑。 或者在业务…

从产品组装和维护/维修的角度来看,基于增强现实的指导:关于挑战和机遇的最新综述

作者&#xff1a; 1. M. Eswaran 2. Anil Kumar Gulivindala 3. M.V.A.Raju Bahubalendruni 关于本文 •分析了增强现实在装配和维护/维修中的作用。 •讨论了AR辅助制造系统的软件和硬件元素。 •讨论了AR跟踪和配准技术面临的挑战。 •讨论了AR辅助制造系统的未来…

使用插件将swagger文档转html或pdf

github上有maven开源插件swagger2markup将swagger文档转为.adoc格式的文档&#xff0c;另外一个maven开源插件asciidoctorj-pdf则可以将.adoc格式的文档转为html和pdf。由于GitHub访问不稳定&#xff0c;在gitee上有镜像项目。所以我就贴gitee上的项目地址了。 实现从swagger文…

【聊一聊】三种工厂模式的创建

三种工厂模式的创建 今天终于星期五了,最近由于碰上一个需求,中间涉及Oracle改国产数据库的改造,好家伙,差点没把我忙坏了 不过今天终于有空啦!~哈哈哈 这篇本应该是上周就结束的,但是拖到今天,我们就今天进行结束 (还有一件快乐的事情,就是我遇见自己喜欢的人啦!嘻嘻) 好啦!~话…

【数字图像处理matlab系列】数组索引

【数字图像处理matlab系列】数组索引 【先赞后看养成习惯】【求点赞+关注+收藏】 MATLAB 支持大量功能强大的索引方案,这些索引方案不仅简化了数组操作,而且提高了程序的运行效率。 1. 向量索引 维数为1xN的数组称为行向量。行向量中元素的存取是使用一维索引进行的。因此…

如何解决Layui后台接口返回数据,但是table.render不渲染表格数据的问题

我这边进行了pareData数据格式转换&#xff0c;response重新定义了layui的参数格式规范 接口正常返回了数据 但是就是不渲染&#xff0c;我这个郁闷啊&#xff01;&#xff01; 忽然&#xff0c;我把后台重新定义的layui规定的格式参数&#xff0c;有个参数名叫data&#xff0…

037—pandas 按指定列堆叠数据

前言 在数据分析中&#xff0c;我们经常需要对数据进行堆叠操作&#xff0c;但 Pandas 提供的 df.stack() 只能按默认索引进行操作&#xff0c;同时堆叠后的列名无法指定&#xff0c;本列我们就来解决这些问题。 读入数据 代码如下&#xff08;示例&#xff09;&#xff1a;…

关于php foreach函数和变量覆盖

foreach函数是PHP中用于遍历数组或对象的函数&#xff08;且仅用于数组的遍历&#xff09;。它允许循环遍历数组中的每个元素&#xff0c;并对每个元素执行相同的操作。foreach语句的基本语法如下&#xff1a; foreach ($array as $value) {//执行的操作 }在这个语法中&#x…

政安晨:【深度学习部署】—— TensorFlow Extended(TFX)介绍

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 前言 TensorFlow Extended&#xff08;TFX&a…

Orbit 使用指南 10|在机器人上安装传感器 | Isaac Sim | Omniverse

如是我闻&#xff1a; 资产类&#xff08;asset classes&#xff09;允许我们创建和模拟机器人&#xff0c;而传感器 (sensors) 则帮助我们获取关于环境的信息&#xff0c;获取不同的本体感知和外界感知信息。例如&#xff0c;摄像头传感器可用于获取环境的视觉信息&#xff0c…