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

news2024/11/24 14:32:39

前言: 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 }));
    }

  

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

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

相关文章

PHP使用PHP_DIO读取串口数据

一、安装PHP_DIO扩展 1. 下载对应版本的dll扩展 根据你的操作系统类型选择对应的扩展名 PECL :: Package :: dio 下载地址&#xff1a; PECL :: Package :: dio 0.2.1 for Windows 以我使用的为例 我本地使用的是phpStudy PHP为7.4.3nts 64位的那就需要下载 注意你的是线程安全…

嵌入式学习42-数据结构-双向链表

知识散记&#xff1a; 1.程序使用时&#xff08;开闭原则&#xff09; …

iOS常见崩溃简介

1. 崩溃 多指在移动设备&#xff08;如iOS、Android设备&#xff09;中或不可移动设备&#xff08;如:Windows、Linux等设备&#xff09;&#xff0c; 在打开或使用应用程序时出现的突然退出中断的情况&#xff08;类似于Windows的应用程序崩溃&#xff09;。 多表现为&#…

全网最详细介绍如何实现图片存储阿里OSS实现资源持久化存储

什么是阿里云OSS 阿里云OSS&#xff08;Object Storage Service&#xff0c;对象存储服务&#xff09;是阿里云提供的一种存储服务&#xff0c;它支持任意类型的数据存储&#xff0c;如图片、视频、日志文件等。OSS以对象&#xff08;Object&#xff09;的形式组织数据&#x…

【导论】数据可信流通 从运维信任到技术信任

信任 信任概念由于其抽象性和结构复杂性&#xff0c;在社会学、心理学、营销学、经济学、管理学等不同 的领域定义是不同的&#xff0c;但是达成共识的观点是&#xff1a;信任是涉及交易或交换关系的基础。 信任的基石 ①身份可确认&#xff0c;②利益可依赖&#xff0c;③能…

docker实战(3)

1, jdk17版本的dockerfile FROM eclipse-temurin:17-jre ADD ./target/ods-poc-0.0.1-SNAPSHOT.jar /home/app/app.jar WORKDIR /home/app ENV TZ Asia/Shanghai ENTRYPOINT ["java","-jar","/home/app/app.jar"] EXPOSE 8083dockerfile 1, …

数据结构的概念大合集02(线性表)

概念大合集02 1、线性表及其逻辑结构1.1 线性表的定义1.2 线性表的基本操作 2、线性表的顺序存储结构2.1 顺序表 3、线性表的链式存储3.1 链表3.1.1 头结点&#xff08;头指针&#xff09;&#xff0c;首指针&#xff0c;尾指针&#xff0c;尾结点3.1.2 单链表3.1.3 双链表3.1.…

Linux第79步_使用自旋锁保护某个全局变量来实现“互斥访问”共享资源

自旋锁使用注意事项:自旋锁保护的“临界区”要尽可能的短。 因此&#xff0c;在open()函数中申请“spinlock_t自旋锁结构变量”&#xff0c;然后在release()函数中释放“spinlock_t自旋锁结构变量”&#xff0c;这种方法就行不通了。如果使用一个变量“dev_stats”来表示“共享…

Nanya(南亚科技)DRAM芯片选型详解

一、DRAM产品选型 普通SDRAM只在时钟的上升期进行数据传输&#xff0c;DDR内存能够在时钟的上升期和下降期各传输一次数据&#xff0c;因此性能翻倍&#xff0c;被称为双倍速率同步动态随机存储器。因此DDR内存可以在与SDRAM相同的总线频率下达到更高的数据传输率。DDR是一种掉…

Pygame AttributeError no attribute ‘display‘问题及其解决方法

目录 前言 错误原因 解决方法 1. 确保正确安装 Pygame 2. 检查 Python 路径和 Pygame 模块位置 3. 修复模块命名冲突 4. 检查代码错误 5. 检查 Pygame 版本兼容性 代码示例 总结 前言 Pygame 是一个非常受欢迎的 Python 游戏开发库&#xff0c;它提供了丰富的功能和…

Linux 学习必备:CentOS 技能提升一站式平台!

介绍&#xff1a;CentOS是一种广泛使用的Linux发行版&#xff0c;特别受到企业用户的青睐。 首先&#xff0c;CentOS的全称是Community Enterprise Operating System&#xff0c;中文意思是“社区企业操作系统”。它起源于Red Hat Enterprise Linux (RHEL)的源代码&#xff0c;…

极智压缩 ——帮你高清无损压缩 JPG/PNG/GIF 图片!

引言 图片太大怎么办&#xff1f;图片该如何压缩&#xff1f;压缩后图片为什么变模糊了&#xff1f;屏幕前的你是不是经常被这些问题所困扰&#xff0c;腾讯云数据万象推出的图片极智压缩服务&#xff0c;可以帮你高清无损压缩 JPG/PNG/GIF 图片&#xff0c;解决你95%以上的图片…

解决虚拟机Linux ens33 没有 IP 地址

解决方法&#xff1a; 先进入 root 模式 sudo su 查看目录 ls /etc/sysconfig 找到上述文件夹 ls /etc/sysconfig/network-scripts/ 用 vim 打开 ifcfg-ens33 这个文件&#xff08;不都是这个名字&#xff0c;按这个方法找到这个文件就行&#xff09; vim /etc/sysconfig/netw…

学习笔记-华为IPD转型2020:3,IPD的实施

3. IPD的实施 1999 年开始的 IPD 转型是计划中的多个转型项目中的第一个&#xff08;Liu&#xff0c;2015&#xff09;。华为为此次转型成立了一个专门的团队&#xff0c;从大约20人开始&#xff0c;他们是华为第一产业的高层领导。董事会主席孙雅芳是这个团队的负责人。该团…

【算法与数据结构】深入二叉树实现超详解

文章目录 &#x1f4dd;前言&#x1f320; 接口函数✏️ 实现函数&#x1f309;创建树的新节点&#x1f320;通过前序遍历的数组构建二叉树&#x1f309;包装通过前序遍历的数组构建二叉树&#x1f320;二叉树的销毁&#x1f320;层次遍历&#x1f320;第一种实现&#xff1a;不…

如何在尽量不损害画质的前提下降低视频占内存大小?视频格式科普及无损压缩软件推荐

大家好呀&#xff0c;相比大家都有对视频画质和体积的追求和取舍&#xff0c;那么&#xff0c;如何才能在不牺牲画质的前提下&#xff0c;尽可能的将视频大小降低到极致呢&#xff1f; 首先我们要了解视频的构成&#xff0c;要想降低视频的体积大小&#xff0c;我们可以从以下几…

Learn OpenGL 22 高级光照与Gamma校正

高级光照 Blinn-Phong 冯氏光照不仅对真实光照有很好的近似&#xff0c;而且性能也很高。但是它的镜面反射会在一些情况下出现问题&#xff0c;特别是物体反光度很低时&#xff0c;会导致大片&#xff08;粗糙的&#xff09;高光区域。下面这张图展示了当反光度为1.0时地板会…

品牌方年度抖音店铺打造流量运营孵化方案

【干货资料持续更新&#xff0c;以防走丢】 品牌方年度抖音店铺打造流量运营孵化方案 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 PDF共120页&#xff08;完整资料包含以下内容&#xff09; 目录 抖音年度短视频直播运营规划方案 1. 帐号视频发布规划 问…

55、服务攻防——数据库安全RedisHadoopMysql未授权访问RCE

文章目录 常见服务应用的安全测试&#xff1a; 配置不当——未授权访问安全机制——特定安全漏洞安全机制——弱口令爆破攻击 应用服务安全测试流程&#xff1a; 判断服务开放情况——端口扫描&组合猜解等 端口扫描&#xff1a;服务开放&#xff0c;绑定端口没开放&#…