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

前言:总算是调测通了

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


一、电源接线:

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

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

相关文章

selenium元素定位--xpath定位--层级与逻辑组合定位

其他元素非唯一时&#xff0c;又不想用xpath绝对定位时&#xff0c;需要用到层级与逻辑定位. 一、层级属性结合定位&#xff1a; 遇到元素没有class、name、id等或属性动态变化情况时&#xff0c;可以找父节点元素&#xff0c;父级节点没有id时&#xff0c;可以继续往上找id&…

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)--问题分析

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)–问题分析 在使用alarm函数进行序号处理测试的时候发现如果把输出重定向到文件里面会导致信号的处理出现严重的延迟(ubuntu18) #include <stdio.h> #include <stdlib.h> #include <unist…

UE5 C++ 3D血条 响应人物受伤 案例

一.3Dwidget 1.创建C Userwidget的 MyHealthWidget&#xff0c;声明当前血量和最大血量 UCLASS() class PRACTICEC_API UMyHealthWidget : public UUserWidget {GENERATED_BODY() public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget")float C…

Ubuntu连不上外网的问题—ping不通baidu.com

一、问题 虚拟机不能联网&#xff0c;ping百度时候出现这个问题 book100ask:~$ ping www.baidu.com ping: www.baidu.com: Name or service not known 二、解决办法 首先&#xff0c;定位问题&#xff0c;再问我出现的问题中&#xff0c;认为是NAT设置的问题&#xff0c;只要…

【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…

matlab编译成jar包

1、输入deploytool命令 2、选择Library Compiler 3、配置打包 4、有效文件 5、java函数调用 package com.beescloud.frame.matlab;import com.mathworks.toolbox.javabuilder.MWException; import test.Class1;public class MatlabTest {public static void main(String[] arg…

PanTools v1.0.17 多网盘批量管理 批量分享、转存、复制...

软件介绍 一款针对多个热门网盘的文件管理、批量分享、批量转存、批量复制、批量重命名、批量链接检测、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者等&#xff0c;对于管理名下具有多个网盘多个账号具有…

UI风格汇:卡通风格(Cartoon Style),极具辨识度的风格

一、卡通风格的特点 卡通风格是一种在UI设计中常见的设计风格&#xff0c;它以卡通或漫画的形式呈现&#xff0c;具有夸张、可爱、幽默和生动的特点。卡通风格的UI设计通常使用明亮的色彩、简化的图形和夸张的表情来表达信息和情感。 以下是卡通风格在UI设计中的一些特点&…

【数字图像处理】改变图像灰度级别

改变图像灰度级别 首先&#xff0c;对原始图像 O O O进行灰度级量化: q int ⁡ ( O 2 i ) 2 i , q\operatorname{int}\left(\frac{O}{2^{i}}\right) \times 2^{i}, qint(2iO​)2i, 灰度级别256&#xff0c;128&#xff0c;64&#xff0c;32&#xff0c;16&#xff0c;8&…

是德科技KEYSIGHT MSOX2024A混合信号示波器

181/2461/8938产品概述&#xff1a; Keysight MSOX2024A 提供适合您预算的入门级价位&#xff0c;以及同类任何其他示波器所不具备的卓越性能和可选功能。凭借是德科技设计的 MegaZoom IV 定制 ASIC 技术&#xff0c;它每秒可提供高达 200,000 个波形。通过这种速度&#xff0…

Typescript语法总结

#Typescript 解决了什么问题 Typescript本质上是在 JavaScript 上增加一套静态类型系统&#xff08;编译时进行类型分析&#xff09;&#xff0c;强调静态类型系统是为了和运行时的类型检查机制做区分&#xff0c;TypeScript 的代码最终会被编译为 JavaScript。 Typescript 创造…

Multimodal Chain-of-Thought Reasoning in Language Models阅读笔记

论文&#xff08;2023年&#xff09;链接&#xff1a;https://arxiv.org/pdf/2302.00923.pdf GitHub项目链接&#xff1a;GitHub - amazon-science/mm-cot: Official implementation for "Multimodal Chain-of-Thought Reasoning in Language Models" (stay tuned a…

QToolButton的工具提示出现自身border-image背景图的问题解决

用QToolButton贴个图片&#xff0c;用来做个指示灯&#xff0c;当鼠标移动到指示灯&#xff0c;弹出工具提示&#xff0c;以便提示该灯用来干嘛的。预想像下面那样&#xff1a; 然而结果却如下&#xff1a; 在Qt Designer或代码中对该QToolButton设置样式表如下&#xff1a; QT…

中国国内怎么使用订阅升级Duolingo多邻国plus?多邻国使用教程

多邻国Duolingo合租平台&#xff0c;环球巴士 首单9折优惠码&#xff1a;110072 多邻国Duolingo是什么&#xff0c;能用来做什么&#xff1f; 众所周知&#xff0c;多邻国考试的性价比非常高&#xff0c;不仅考试时间短&#xff0c;出分也很快&#xff0c;国际认可度越来越高…

无人机采集图像的相关知识

1.飞行任务规划 一般使用飞行任务规划软件进行飞行任务的设计&#xff0c;软件可以自动计算相机覆盖和图像重叠情况。比如ArduPilot (ArduPilot - Versatile, Trusted, Open) 和UgCS (http://www.ugcs.com)是两个飞行任务规划软件&#xff0c;可以适用大多数无人机系统。 2.图…

教育行业信息数据化:探索8种不同的数据库类型及用途

前言 教育数据库是现代教育领域中不可或缺的重要工具&#xff0c;它们涵盖了多种类型&#xff0c;包括学生信息系统、学习管理系统、图书馆管理数据库、行政数据库、研究数据库、专业教育数据库等。这些数据库在教育机构中发挥着关键作用&#xff0c;为教育工作者和学生提供了…

探究 HTTPS 的工作过程

目录 1. HTTPS 协议原理 1.1. 为什么要有HTTPS协议 1.2. 如何理解安全 1.3. HTTPS 协议是什么 2. HTTPS 的前置概念 2.1. 什么是加密 && 解密 2.2. 为什么要加密 2.3. 常见的加密方式 2.3.1. 对称加密 2.3.2. 非对称加密 2.4. 数据摘要 && 数据指纹…

Git常用指令使用

摘要&#xff1a;之前代码管理都是借助于fork、sourceTree等图形工具&#xff0c;最近发现直接用命令也好用&#xff0c;就总结Git常用的指令 1、Git的介绍 1.1 git官网 安装: Git - Downloading Packagehttps://git-scm.com/download/mac Mac上安装&#xff0c;直接使…

蓝桥杯刷题8

1. 世纪末的星期 import java.util.Calendar; public class Main {public static void main(String[] args) {Calendar calendar Calendar.getInstance();for(int year 1999;year<100000;year100){calendar.set(Calendar.YEAR,year);calendar.set(Calendar.MONTH,11);cale…

【贪心]【字符串】【分类讨论】420 强密码检验器

本文涉及知识点 贪心 字符串 分类讨论 LeetCode420 强密码检验器 满足以下条件的密码被认为是强密码&#xff1a; 由至少 6 个&#xff0c;至多 20 个字符组成。 包含至少 一个小写 字母&#xff0c;至少 一个大写 字母&#xff0c;和至少 一个数字 。 不包含连续三个重复字…