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

前言:总算是调测通了

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


一、电源接线:

        如同前面预想的,把买回来的电源尾线按照颜色相接,用电工胶布给裹起来,防止漏电。理论上就是这样操作,不过接电的时候,心里还是有点小忐忑,接通电源后,好一会摄像头没有反应,心里咯噔一下,难道给烧了,还好随着前面的灯亮起来,表明摄像头开始工作,最后到登录到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 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_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 devicem_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文库

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

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

相关文章

masterGo 的设计网站介绍

https://mastergo.com/files/home 这个网站是一个设计图片的网站 ui设计方面的网站 有很多优秀的资源 比如App设计 可以直接用的图片 和设计模板 也可以像ps 一样 设计自己的图片或者ui图 适合前端和ui开发者使用 可以丰富自己的审美观

宝塔面板操作一个服务器域名部署多个网站

此处记录IP一样&#xff0c;端口不一样的操作方式&#xff1a; 宝塔面板操作&#xff1a; 1、创建第一个网站&#xff1a; 网站名用IP地址&#xff0c;默认80端口。 创建好后&#xff0c;直接IP访问就可以了。看到自带的默认首页 2、接下来部署第二个网站&#xff1a; 仍然是…

集成ES分组查询统计求平均值

前言 之前其实写过ES查询数据&#xff0c;进行分组聚合统计&#xff1a; 复杂聚合分组统计实现 一、目标场景 机房机柜的物联网设备上传环境数据&#xff0c;会存储到ES存到ES的温湿度数据需要查询&#xff0c;进行分组后&#xff0c;再聚合统计求平均值 二、使用步骤 1.引入…

docker快速安装Es和kibana

文章目录 概要一、Es二、kibana三、dcoker compose管理四、参考 概要 在工作过程中&#xff0c;经常需要测试环境搭建Es环境&#xff0c;本文基于Es V8.12.2来演示如何快速搭建单节点Es和kibana。 服务器默认已按装docker 一、Es 1&#xff1a;拉取镜像 docker pull elast…

docker安装elasticseachkibana

1.docker安装es 创建本机挂载目录&#xff0c;与容器上目录映射 /Users/wangpei/2024/mydata/elasticsearch conf下创建yml文件 echo "http.host : 0.0.0.0" >> /Users/wangpei/2024/mydata/elasticsearch/config/elasticsearch.yml 安装容器&#xff1a; d…

Ansys Speos | Light Expert Group探测器组使用技巧

附件下载 联系工作人员获取附件 概述 相机挡板的设计需要在光路的不同位置同步多个照度图&#xff0c;以尽量减少杂散光。2023R2 Speos提供了一种新的探测器&#xff0c;用于高阶杂散光分析&#xff0c;可以同时对多个探测器进行光线追迹。Light Expert工具可以即时过滤3D视…

Day48:WEB攻防-PHP应用文件上传中间件CVE解析第三方编辑器已知CMS漏洞

目录 PHP/ASP-中间件-上传相关-IIS&Apache&Nginx(解析漏洞) IIS Apache Nginx PHP-编辑器-上传相关-第三方处理引用 PHP-CMS源码-上传相关-已知识别到利用 知识点&#xff1a; 1、PHP-中间件-文件上传-CVE&配置解析 2、PHP-编辑器-文件上传-第三方引用安全 3…

C#学习笔记3:Windows窗口计时器

今日继续我的C#学习之路&#xff0c;今日学习自己制作一个Windows窗口计时器程序&#xff1a; 文章提供源码解释、步骤操作、整体项目工程下载 完成后的效果大致如下&#xff1a;&#xff08;可选择秒数&#xff0c;有进度条&#xff0c;开始计时按钮等&#xff09; &#xf…

C++的string类(二):string类的实际OJ应用

目录 1、找出字符串中第一个只出现一次的字符 2、字符串相乘 3、反转字符串中的单词 III 4、反转字符串 II 5、字符串相加 6、验证回文串 7、字符串最后一个单词的长度 8、字符串中的第一个唯一字符 9、仅仅反转字母 1、找出字符串中第一个只出现一次的字符 #include…

nacos服务分级存储(权重配置)

需求&#xff1a;服务器分级存储的访问优先级&#xff1f; 一个服务可以有多个实例&#xff0c;例如我们的user-service&#xff0c;可以有: 127.0.0.1:8081 127.0.0.1:8082 127.0.0.1:8083 这里user服务copy了三个实例出来、。 127.0.0.1:8083杭州127.0.0.1:8082成都127.…

Python包管理工具 pip 及其常用命令和参数用法

目录 PIP 主要功能 安装包 升级包 卸载包 列出包 检查依赖 pip的配置和环境 主要用法 1&#xff1a;版本 2&#xff1a;安装 Python 库 3&#xff1a;升级库 4&#xff1a;卸载库 5&#xff1a;搜索库 6&#xff1a;查看已安装库详细信息 7&#xff1a;只下载库…

POE供电IP网络广播号角 网络号角喇叭SV-7044

POE供电IP网络广播号角 网络号角喇叭SV-7044 SV-7044是一款网络号角喇叭&#xff0c;具有10/100M以太网接口&#xff0c;从网络接口接收网络的音频数据后播放。 本网络号角喇叭内置有一个高品质扬声器&#xff0c;提供立体声的音频播放。该网络号角喇叭可以直接播放来自网络的音…

00000基础搭建vue+flask前后端分离项目

我完全是参考的这个vue3flask前后端分离环境速建_flask vue3-CSDN博客 安装了node_js&#xff08;添加了环境变量&#xff09; 环境变量 把原来的镜像源换成了淘宝镜像源 npm config set registry https://registry.npmmirror.com/ 查看版本证明安装成功 npm - v 安装npm i…

学习Dive into Deep learning:2.1数据操作,张量(tensor)

首先&#xff0c;我们介绍n维数组&#xff0c;也称为张量&#xff08;tensor&#xff09;。 使用过Python中NumPy计算包的读者会对本部分很熟悉。 无论使用哪个深度学习框架&#xff0c;它的张量类&#xff08;在MXNet中为ndarray&#xff0c; 在PyTorch和TensorFlow中为Tensor…

(二)Eureka服务搭建,服务注册,服务发现

1.Eureka注册中心 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 存在几个问题&#xff1a; order-service在发起远程调用的时候&#xff0c;该如何得知user-service实例的ip地址和端口&#xff1f;有多个user-service实例地址&#xff0c;…

HCIP—BGP路由发布

R1和R2&#xff0c;R4和R5建立EBGP对等体 R1和R2&#xff08;R4和R5&#xff09;之间属于EBGP对等体&#xff0c;可以使用直连物理接口建立对等体关系&#xff0c;TTL值默认1。由于使用直连物理接口方式建立&#xff0c;刚好一跳到达。 [R1]bgp 100 [R1-bgp]router-i…

【Frida】【Android】02_JAVA层HOOK

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

Trapcode Particular---打造惊艳粒子效果

Trapcode Particular是Adobe After Effects中的一款强大3D粒子系统插件&#xff0c;其能够创造出丰富多样的自然特效&#xff0c;如烟雾、火焰和闪光&#xff0c;以及有机的和高科技风格的图形效果。Trapcode Particular功能丰富且特色鲜明&#xff0c;是一款为Adobe After Eff…

用 JavaScript 发起 HTTP 请求的几种方法

JavaScript 具有非常棒的模块和方法&#xff0c;可以用来建立可从服务器端资源发送或接收数据的 HTTP 请求。本文会带着大家一起看看在 JavaScript 中常用的建立 HTTP 请求的方式有哪些。 Ajax Ajax 是最常规的建立异步 HTTP 请求的方式。你可以使用 HTTP POST 方法来发送数据…

第44期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…