首页 > 其他分享 >拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

时间:2024-03-27 16:59:08浏览次数:21  
标签:string CHCNetSDK 威视 拌合 海康 struITSPlateResult new NET DVR

前言:总算是调测通了

        话接上回,车牌识别摄像头买回来了,卡在电源上了,今天抽时间把电源问题解决了,开始代码正式的调测。一切还算顺利了,没有再碰到打脸的事情了。


一、电源接线:

        如同前面预想的,把买回来的电源尾线按照颜色相接,用电工胶布给裹起来,防止漏电。理论上就是这样操作,不过接电的时候,心里还是有点小忐忑,接通电源后,好一会摄像头没有反应,心里咯噔一下,难道给烧了,还好随着前面的灯亮起来,表明摄像头开始工作,最后到登录到web管理界面,表明一切正常才测底放下心来。

        接的有点丑,反正只是测试凑合用了。整了杯子放进去,前面放了个星爸爸的咖啡瓶算是把摄像头立起来,再台面上做测试了。

二、登录后台管理设置IP

        海康威视的摄像头,默认的IP是192.168.1.64, 接入网络后,将电脑ip增加了192.168.1.88,然后就可以访问到后台。第一次登录就会提示你设置密码的,账号都是admin        

需要下载插件后才可以用,安装就按照提示下一步下一步了。

在配置-》网络-》网络参数菜单下设置IP地址,为了保证时间准确,最好摄像头可以联网,如果要用萤石云也许要联网。注意配置DNS,要不很多服务没法用。

我还习惯去修改ntp服务器,设置为阿里云 ntp1.aliyun.com,校准摄像头的时间。

三、使用摄像头自带后台体验车牌识别。

        还需要绘制车牌识别线。比较乱,清允许我打个码

        可以直接点击下面有个获取推荐值的按钮,实际业务就需要根据现场环境来进行设置。回到首页点击布防就可以来做测试。懒得打码截图我就把预览线关了

我是用手机下载了车牌的图片,模拟了有车经过。继续打码,这样再下面会识别出来车牌数据。获取到两个数据,一个是车牌的颜色,一个就是车牌了。到此摄像头是算正常使用了。后面核心就是如何来通过编程获取。

四、代码实现

        前面的代码都有些纸上谈兵,没有跟真实的摄像头来做对接调试。这次算是实战了,首先说个经验,之前看的文档,都是说通过设置告警服务器,在后台页面一直没有找到告警服务器设置的地方,后来才发现,是要先登录,然后进行布防才可以。

1. copy CHCNetSDK.cs 到程序目录下和 库文件到debug目录下就不重复演示了,前面的文章已经输过多次。

2. 窗体添加了一个Textbox,两个picturebox 和 一个按钮

LogTextbox用来接收告警收到的信息,两个picturebox小的用来显示获取到车牌小图,打的用来显示获取到的拍摄图片。

3.  定义一些类属性和委托

 

 private Int32 m_lUserID = -1;
 private Int32[] m_lAlarmHandle = new Int32[200];
 private Int32 iListenHandle = -1; 
 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 UpdateLogTextBoxCallBackException(string strAlarmMsg);
 public delegate void updatePic1(string image);
 public delegate void updatePic2(string  image);

     这里之所以需要用到委托,直接更新textbox文本中的内容,以及复制picturebox的image会提示不是从齐创建的线程调用。

4. 初始化SDK

 if (!System.IO.Directory.Exists(".\\picture"))
 {

     System.IO.Directory.CreateDirectory("picture");
 }
 bool m_bInitSDK = CHCNetSDK.NET_DVR_Init();
 if (m_bInitSDK == false)
 {
     MessageBox.Show("NET_DVR_Init error!");
     return;
 }
 else
 {
     //保存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_falarmData_V31 == null)
     {
         m_falarmData_V31 = new CHCNetSDK.MSGCallBack_V31(MsgCallback_V31);
     }
     CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(m_falarmData_V31, IntPtr.Zero);

 }

5.  简化了的MsgCallback_V31, 因为明确知道只需要处理车牌识别的告警

        public bool MsgCallback_V31(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
        {
           

            if (lCommand == CHCNetSDK.COMM_ITS_PLATE_RESULT)
            {

                ProcessCommAlarm_ITSPlate(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);

            }

            return true; //回调函数需要有返回,表示正常接收到数据
        }

6.  车牌告警事件处理函数

    private void ProcessCommAlarm_ITSPlate(ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
    {
        CHCNetSDK.NET_ITS_PLATE_RESULT struITSPlateResult = new CHCNetSDK.NET_ITS_PLATE_RESULT();
        uint dwSize = (uint)Marshal.SizeOf(struITSPlateResult);

        struITSPlateResult = (CHCNetSDK.NET_ITS_PLATE_RESULT)Marshal.PtrToStructure(pAlarmInfo, typeof(CHCNetSDK.NET_ITS_PLATE_RESULT));
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        string stringPlateLicense = System.Text.Encoding.GetEncoding("GBK").GetString(struITSPlateResult.struPlateInfo.sLicense).TrimEnd('\0');

        //保存抓拍图片
        for (int i = 0; i < struITSPlateResult.dwPicNum; i++)
        {
            if (struITSPlateResult.struPicInfo[i].dwDataLen != 0)
            {
             /*  // string str = ".\\picture\\ITS_UserID_[" + pAlarmer.lUserID + "]_Pictype_" + struITSPlateResult.struPicInfo[i].byType
                    + "_PicNum[" + (i + 1) + "]_" + iFileNumber + ".jpg";*/

                string str  =".\\picture\\" + stringPlateLicense + "-" +  DateTime. Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
                FileStream fs = new FileStream(str, FileMode.Create);
                int iLen = (int)struITSPlateResult.struPicInfo[i].dwDataLen;
                byte[] by = new byte[iLen];
                Marshal.Copy(struITSPlateResult.struPicInfo[i].pBuffer, by, 0, iLen);
                fs.Write(by, 0, iLen);
                fs.Close();
                if(System.IO.File.Exists(str)) {
                    if (i == 0)
                    {

                        pictureBox2.BeginInvoke(new updatePic1(updatePicBox2), str);
                    }
                    else {

                        pictureBox1.BeginInvoke(new updatePic2(updatePicBox1), str);

                    }
                
                
                }

                iFileNumber++;
            }
        }
        //报警设备IP地址
        string strIP = System.Text.Encoding.UTF8.GetString(pAlarmer.sDeviceIP).TrimEnd('\0');

        //抓拍时间:年月日时分秒
        string strTimeYear = string.Format("{0:D4}", struITSPlateResult.struSnapFirstPicTime.wYear) +
            string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.byMonth) +
            string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.byDay) + " "
            + string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.byHour) + ":"
            + string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.byMinute) + ":"
            + string.Format("{0:D2}", struITSPlateResult.struSnapFirstPicTime.bySecond) + ":"
            + string.Format("{0:D3}", struITSPlateResult.struSnapFirstPicTime.wMilliSec);

    
        string stringAlarm = "抓拍上传," + "车牌:" + stringPlateLicense + ",车辆序号:" + struITSPlateResult.struVehicleInfo.dwIndex;
        LogText.BeginInvoke(new UpdateLogTextBoxCallBackException(updateLogText), stringAlarm);

    }

这里有个小坑,应为使用的编码是GBK,我用的是.net8, 提示没有这个编码,最后是安装了 System.Text.Encoding.CodePages

还需要增加一行代码再使用GBK编码前

System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

7. 登录设备:

 CHCNetSDK.NET_DVR_USER_LOGIN_INFO struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();
 //设备IP地址或者域名
 byte[] byIP = System.Text.Encoding.Default.GetBytes("设备IP");  
 struLogInfo.sDeviceAddress = new byte[129];
 byIP.CopyTo(struLogInfo.sDeviceAddress, 0);
 //设备用户名
 byte[] byUserName = System.Text.Encoding.Default.GetBytes("admin");
 struLogInfo.sUserName = new byte[64];
 byUserName.CopyTo(struLogInfo.sUserName, 0);           
 //设备密码
 byte[] byPassword = System.Text.Encoding.Default.GetBytes("设备密码");
 struLogInfo.sPassword = new byte[64];
 byPassword.CopyTo(struLogInfo.sPassword, 0);
 struLogInfo.wPort = 8000;//设备服务端口号
 struLogInfo.cbLoginResult = LoginCallBack;
 struLogInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是 
 struLogInfo.byLoginMode = 0; //0-Private, 1-ISAPI, 2-自适应
 struLogInfo.byHttps = 0; //0-不适用tls,1-使用tls 2-自适应
 CHCNetSDK.NET_DVR_DEVICEINFO_V40 DeviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();
 //登录设备 Login the device
 m_lUserID = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref DeviceInfo);

8. 进行布防:

    CHCNetSDK.NET_DVR_SETUPALARM_PARAM struAlarmParam = new CHCNetSDK.NET_DVR_SETUPALARM_PARAM();
    struAlarmParam.dwSize = (uint)Marshal.SizeOf(struAlarmParam);
    struAlarmParam.byLevel = 1; //0- 一级布防,1- 二级布防
    struAlarmParam.byAlarmInfoType = 1;//智能交通设备有效,新报警信息类型
    struAlarmParam.byFaceAlarmDetection = 1;//1-人脸侦测
    m_lAlarmHandle[m_lUserID] = CHCNetSDK.NET_DVR_SetupAlarmChan_V41(m_lUserID, ref struAlarmParam);

9.  启动本机端口进行监听:

string sLocalIP = "本机IP";
ushort wLocalPort = 7200; //端口可以修改   
 iListenHandle = CHCNetSDK.NET_DVR_StartListen_V30(sLocalIP, wLocalPort, m_falarmData, IntPtr.Zero);

核心代码如上,效果如下:

完整的代码放到了下载中心,不需要下载分 ,如有疑问欢迎探讨。【免费】海康威视摄像头车牌识别范例资源-CSDN文库

标签:string,CHCNetSDK,威视,拌合,海康,struITSPlateResult,new,NET,DVR
From: https://blog.csdn.net/waxyy002/article/details/137052899

相关文章

  • 海康威视网络摄像头,把电脑作为硬盘录像机使用。方便别人方便自己。
    第一步,到官网https://www.hikvision.com/cn/服务支持》下载中心》桌面应用软件》客户端  下载   iVMS-4200(V3.11.0.5_C)  和  存储服务器 这2个软件下载到本地第二步,安装好2个软件。第三步,添加摄像头,不知道或忘记密码就网上找方法,很好找的。说明:一个是摄像头......
  • 海康工业面阵相机
     测试型号:MV-CA032-10GCIMX2652048×153637.5fpsGigE即将退市MV-CU060-10GCIMX1783072×204819.1fpsGigE已发布MV-CS060-10GCIMX1783072×204819.1fpsGigE已发布                      ......
  • Qt/C++通用跨平台Onvif工具/支持海康大华宇视华为天地伟业等/云台控制/预置位管理/工
    一、前言在安防视频监控行业,Onvif作为国际标准,几乎主要的厂商都支持,不仅包含了国内的厂商,也包括主要的国际厂商,由于有了这个标准的存在,使得不同设备不同安防平台之间,能够接入各个厂家的硬件设备,互通有无,你中有我我中有你,实现良性竞争。ONVIF是一个全球性的开放式行业协议,其目标是......
  • 通过XMLRpc控制海康VB2200视觉控制器自带光源接口
    在使用HikVB2200视觉控制器时,由于并未使用VisionMaster软件,但是使用了视觉控制器的光源接口。导致无法直接控制该光源接口。VB2200视觉控制器提供了一个IOController应用程序,其中对应的exe文件可以设置为对应光源接口的亮度等参数,基本满足需求。但是IOController只能设置......
  • LiveGBS流媒体平台GB/T28181常见问题-与海康NCG大华VIS等国标平台对接如何判断自身是
    LiveGBS与海康NCG大华VIS等国标平台对接如何判断自身是上级还是下级?1、背景2、判定上级或是下级3、LiveGBS作为上级4、LiveGBS作为下级5、搭建GB28181视频直播平台1、背景国标项目实施的过程中,经常要与海康、大华、华为、宇视等国标视频平台对接,此时LiveGBS是作为下......
  • 拌合楼管理系统开发(五) 数据库表和字段的设计方案
    前言:继续闭门造车    今天花时间把前面一段时间思考的整个拌合楼管理系统的数据库实现在mysql中建立起来了.表和字段含义如下了一、数据库表目录序号表名注释/说明1Company往来单位2ContractAttach合同附件3ContractBody合同表体4Contr......
  • Linux Java调用 海康sdk报 Unable to load library '/home/slife/bsmt/HCNetSDK_linux
    1、问题在Linux下java调研libPlayCtrl.so文件失败 解决方案:sudovim~/.bashrc 在该文件末尾追加:exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/slife/bsmt/HCNetSDK_linux64/刷新一下source~/.bashrcok参考链接 https://www.cnblogs.com/kikyoqiang/p/14911373.......
  • 海康摄像头GB28181语音喊话/双向喊话的配置以及海康摄像头如何在公网GB28181喊话
    @目录1、背景2、准备2.1、服务端必备条件(注意)2.2、准备语音对讲设备2.2.1、不支持跨网对讲示例2.2.2、支持跨网对讲示例3、开启音频开始对讲4、搭建GB28181视频直播平台1、背景GB28181支持国标协议的设备,通过GB28181注册接入到国标视频平台后。视频平台在某些情况下需要喊话摄......
  • 常见问题解决 --- 海康OpenAPI安全认证库的demo运行报错
    我要开发一个对接海康isc平台的oss的api,发现需要有海康登录库和ak、sk的配合才能完成。在海康官方下载OpenAPI安全认证库(JAVA)V1.1.11,解压后用idea打开demo发现一对报错。解决办法:1.修复基本的错误。比如包名报错,应该是  packagega; 2.修复maven依赖导入报错。首先是artem......
  • Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监
    一、前言为什么需要判断视频文件是否含有B帧,这个在推流的时候很容易遇到这个问题,一般来说,没有B帧的视频文件,解码后的数据帧pts和dts都是顺序递增的,而有B帧的则未必,可能有些需要先解码后面显示,B帧也是双向预测图像B,对它的编码,即是对它前后帧的像素值之差进行编码,B帧是双向差别帧,也......