【开源】基于 C# 和 Halcon 机器视觉开发的车牌识别工具(附带源码)

文章目录

  • 项目介绍
  • 应用场景
  • 功能特点
  • Halcon关键代码
  • 功能截图
  • 源码地址
  • C#调用项目代码

项目介绍

halcon_chepai一款基于C#编程语言与Halcon机器视觉库的车牌识别系统。该系统利用Halcon强大的图像处理能力,结合C#的灵活性与易用性,实现了高效、准确的车牌识别功能。识别成功率高达90%。

注意:项目中只引用了HalconDotNet.dll,还需安装halcon环境,或将halcon的安装路径文件放到本项目debug里才能正常运行。

应用场景

  • 智能交通系统:在交通监控、违章抓拍等场景中,自动识别车牌号码,辅助交通管理。
  • 停车场管理:自动识别进出车辆的车牌,实现自动化停车计费与管理。
  • 物流追踪:在物流园区或货运站,通过车牌识别追踪货物运输车辆。
  • 安防监控:在重要区域或场所的出入口,通过车牌识别加强安全监控。

功能特点

  • 高精度识别:利用Halcon先进的图像处理算法,实现高精度的车牌识别。
  • 实时性强:优化算法与处理流程,确保系统实时响应,满足实时监控需求。
  • 适应性强:能够适应不同光照条件、车牌类型与倾斜角度的车牌识别。
  • 易用性高:提供友好的用户界面与简单的操作方式,降低使用门槛。

Halcon关键代码

dev_close_window()dev_clear_window()read_image(image,'C:/Users/Administrator/Desktop/halcon/chepai4.jpg')get_image_size(image,Width,Height)dev_open_window_fit_size(0,0,Width,Height,-1,-1,WindowHandle)dev_display(image)* 将图片转化为rgb三通道decompose3(image,r,g,b)* 转为hsv 色调 饱和度 明度值 trans_from_rgb(r,g,b,h,s,v,'hsv')* 提升图片对比度emphasize(s,ImageEmphasize,Width,Height,1)threshold(ImageEmphasize,Region,255,255)connection(Region,ConnectedRegions)closing_rectangle1(ConnectedRegions,RegionClosing,50,50)* 按照最大面积选 select_shape_std(RegionClosing,SelectedRegions,'max_area',70)* 填充选出区域的孔洞 fill_up(SelectedRegions,RegionFillUp)* 抠图 reduce_domain(ImageEmphasize,RegionFillUp,ImageReduced)* 抠出原图 reduce_domain(image,RegionFillUp,ImageReduced1)* 识别threshold(ImageReduced,Region1,0,100)* 打断连接区域connection(Region1,ConnectedRegions1)* 筛选显示区域 select_shape(ConnectedRegions1,SelectedRegions1,'area','and',4014,19840.76)* 排序区域 sort_region(SelectedRegions1,SortedRegions,'character','true','row')* 反转图片 invert_image(ImageReduced1,ImageInvert)* 开始识别 read_ocr_class_mlp('Industrial_0-9A-Z_NoRej.omc',OCRHandle)do_ocr_multi_class_mlp(SortedRegions,ImageInvert,OCRHandle,Class,Confidence)

功能截图

源码地址

https://gitee.com/ss123true/halcon_chepai

C#调用项目代码

界面

HalconDev类

using HalconDotNet;using System.Collections;using System.Collections.Generic;using System.Windows.Forms;using System.Windows.Forms.VisualStyles;public partial class HalconDev{private HTuple windowHandle;public List<string[]> action(int threhold_down, int threhold_up, int area_down,int area_up,PictureBox pcb,string path){List<string[]> dic = new List<string[]>();// Local iconic variables HObject ho_image,ho_r,ho_g,ho_b,ho_h,ho_s;HObject ho_v,ho_ImageEmphasize,ho_Region,ho_ConnectedRegions;HObject ho_RegionClosing,ho_SelectedRegions,ho_RegionFillUp;HObject ho_ImageReduced,ho_ImageReduced1,ho_Region1,ho_ConnectedRegions1;HObject ho_SelectedRegions1,ho_SortedRegions,ho_ImageInvert;// Local control variables HTuple hv_Width = newHTuple(),hv_Height = newHTuple();HTuple hv_WindowHandle = newHTuple(),hv_OCRHandle = newHTuple();HTuple hv_Class = newHTuple(),hv_Confidence = newHTuple();// Initialize local and output iconic variables HOperatorSet.GenEmptyObj(out ho_image);HOperatorSet.GenEmptyObj(out ho_r);HOperatorSet.GenEmptyObj(out ho_g);HOperatorSet.GenEmptyObj(out ho_b);HOperatorSet.GenEmptyObj(out ho_h);HOperatorSet.GenEmptyObj(out ho_s);HOperatorSet.GenEmptyObj(out ho_v);HOperatorSet.GenEmptyObj(out ho_ImageEmphasize);HOperatorSet.GenEmptyObj(out ho_Region);HOperatorSet.GenEmptyObj(out ho_ConnectedRegions);HOperatorSet.GenEmptyObj(out ho_RegionClosing);HOperatorSet.GenEmptyObj(out ho_SelectedRegions);HOperatorSet.GenEmptyObj(out ho_RegionFillUp);HOperatorSet.GenEmptyObj(out ho_ImageReduced);HOperatorSet.GenEmptyObj(out ho_ImageReduced1);HOperatorSet.GenEmptyObj(out ho_Region1);HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1);HOperatorSet.GenEmptyObj(out ho_SelectedRegions1);HOperatorSet.GenEmptyObj(out ho_SortedRegions);HOperatorSet.GenEmptyObj(out ho_ImageInvert);if (HDevWindowStack.IsOpen()){HOperatorSet.CloseWindow(HDevWindowStack.Pop());}if (HDevWindowStack.IsOpen()){HOperatorSet.ClearWindow(HDevWindowStack.GetActive());}ho_image.Dispose();HOperatorSet.ReadImage(out ho_image,path);hv_Width.Dispose();hv_Height.Dispose();HOperatorSet.GetImageSize(ho_image,out hv_Width,out hv_Height);hv_WindowHandle.Dispose();HOperatorSet.OpenWindow(0,0,pcb.Width,pcb.Height,pcb.Handle,"visible","",out windowHandle);HDevWindowStack.Push(windowHandle);//将图片转化为rgb三通道 ho_r.Dispose();ho_g.Dispose();ho_b.Dispose();HOperatorSet.Decompose3(ho_image,out ho_r,out ho_g,out ho_b);//转为hsv 色调 饱和度 明度值 ho_h.Dispose();ho_s.Dispose();ho_v.Dispose();HOperatorSet.TransFromRgb(ho_r,ho_g,ho_b,out ho_h,out ho_s,out ho_v,"hsv");//提升图片对比度 ho_ImageEmphasize.Dispose();HOperatorSet.Emphasize(ho_s,out ho_ImageEmphasize,hv_Width,hv_Height,1);ho_Region.Dispose();HOperatorSet.Threshold(ho_ImageEmphasize,out ho_Region,255,255);ho_ConnectedRegions.Dispose();HOperatorSet.Connection(ho_Region,out ho_ConnectedRegions);ho_RegionClosing.Dispose();HOperatorSet.ClosingRectangle1(ho_ConnectedRegions,out ho_RegionClosing,50,50);//按照最大面积选 ho_SelectedRegions.Dispose();HOperatorSet.SelectShapeStd(ho_RegionClosing,out ho_SelectedRegions,"max_area",70);//填充选出区域的孔洞 ho_RegionFillUp.Dispose();HOperatorSet.FillUp(ho_SelectedRegions,out ho_RegionFillUp);//抠图 ho_ImageReduced.Dispose();HOperatorSet.ReduceDomain(ho_ImageEmphasize,ho_RegionFillUp,out ho_ImageReduced);//抠出原图 ho_ImageReduced1.Dispose();HOperatorSet.ReduceDomain(ho_image,ho_RegionFillUp,out ho_ImageReduced1);//识别 ho_Region1.Dispose();HOperatorSet.Threshold(ho_ImageReduced,out ho_Region1,threhold_down,threhold_up);// 0 100 //打断连接区域 ho_ConnectedRegions1.Dispose();HOperatorSet.Connection(ho_Region1,out ho_ConnectedRegions1);//筛选显示区域 ho_SelectedRegions1.Dispose();HOperatorSet.SelectShape(ho_ConnectedRegions1,out ho_SelectedRegions1,"area","and",area_down,area_up);//4014,19840.76 //排序区域 ho_SortedRegions.Dispose();HOperatorSet.SortRegion(ho_SelectedRegions1,out ho_SortedRegions,"character","true","row");//反转图片 ho_ImageInvert.Dispose();HOperatorSet.InvertImage(ho_ImageReduced1,out ho_ImageInvert);//开始识别 hv_OCRHandle.Dispose();HOperatorSet.ReadOcrClassMlp("Industrial_0-9A-Z_NoRej.omc",out hv_OCRHandle);hv_Class.Dispose();hv_Confidence.Dispose();HOperatorSet.DoOcrMultiClassMlp(ho_SortedRegions,ho_ImageInvert,hv_OCRHandle,out hv_Class,out hv_Confidence);if (HDevWindowStack.IsOpen()){dic.Clear();HOperatorSet.DispObj(ho_ImageReduced1,windowHandle);HOperatorSet.DispObj(ho_image,windowHandle);HOperatorSet.DispObj(ho_Region1,windowHandle);HOperatorSet.WriteString(windowHandle,hv_Class);string[] cls = hv_Class.ToSArr();string[] confidence = hv_Confidence.ToSArr();for(int i = 0;i< cls.Length;i++){dic.Add(new string[]{cls[i],confidence[i]});}}ho_image.Dispose();ho_r.Dispose();ho_g.Dispose();ho_b.Dispose();ho_h.Dispose();ho_s.Dispose();ho_v.Dispose();ho_ImageEmphasize.Dispose();ho_Region.Dispose();ho_ConnectedRegions.Dispose();ho_RegionClosing.Dispose();ho_SelectedRegions.Dispose();ho_RegionFillUp.Dispose();ho_ImageReduced.Dispose();ho_ImageReduced1.Dispose();ho_Region1.Dispose();ho_ConnectedRegions1.Dispose();ho_SelectedRegions1.Dispose();ho_SortedRegions.Dispose();ho_ImageInvert.Dispose();hv_Width.Dispose();hv_Height.Dispose();hv_WindowHandle.Dispose();hv_OCRHandle.Dispose();hv_Class.Dispose();hv_Confidence.Dispose();return dic;}}

Form1.cs

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace halcon_chepai{public partial class Form1 : Form{private HalconDev halconDev;private int threhold_up_value = 100;private int threhold_down_value = 0;private int area_down_value = 4014;private int area_up_value = 19840;public Form1(){halconDev = newHalconDev();InitializeComponent();threshold_down.Value = threhold_down_value;threshold_up.Value = threhold_up_value;area_up.Value = area_up_value;area_down.Value = area_down_value;threhold_up_label.Text = threhold_up_label.Text +" : "+ threhold_up_value;threhold_down_label.Text = threhold_down_label.Text +" : "+threhold_down_value;area_down_label.Text = area_down_label.Text +" : "+ area_down_value;area_up_label.Text = area_up_label.Text +" : "+ area_up_value;}private void button1_Click(object sender, EventArgs e){try{var dic = halconDev.action(threhold_down_value,threhold_up_value,area_down_value,area_up_value,pictureBox1,textBox1.Text);listView1.Items.Clear();foreach(var i in dic){ListViewItem item = newListViewItem();item.SubItems.Add(i[1]);item.Text = i[0];listView1.Items.Add(item);}}catch (Exception ex){label1.Text = ex.Message;}}private void threshold_down_Scroll(object sender, EventArgs e){try{threhold_down_value = threshold_down.Value;threhold_down_label.Text = threhold_down_label.Text.Split(':')[0].Replace(" ","")+" : "+ threhold_down_value;var dic = halconDev.action(threhold_down_value,threhold_up_value,area_down_value,area_up_value,pictureBox1,textBox1.Text);listView1.Items.Clear();foreach (var i in dic){ListViewItem item = newListViewItem();item.SubItems.Add(i[1]);item.Text = i[0];listView1.Items.Add(item);}}catch(Exception ex){label1.Text = ex.Message;}}private void threshold_up_Scroll(object sender, EventArgs e){try{threhold_up_value = threshold_up.Value;threhold_up_label.Text = threhold_up_label.Text.Split(':')[0].Replace(" ","")+" : "+ threhold_up_value;var dic = halconDev.action(threhold_down_value,threhold_up_value,area_down_value,area_up_value,pictureBox1,textBox1.Text);listView1.Items.Clear();foreach (var i in dic){ListViewItem item = newListViewItem();item.SubItems.Add(i[1]);item.Text = i[0];listView1.Items.Add(item);}}catch (Exception ex){label1.Text = ex.Message;}}private void area_down_Scroll(object sender, EventArgs e){try{area_down_value = area_down.Value;area_down_label.Text = area_down_label.Text.Split(':')[0].Replace(" ","")+" : "+ area_down_value;var dic = halconDev.action(threhold_down_value,threhold_up_value,area_down_value,area_up_value,pictureBox1,textBox1.Text);listView1.Items.Clear();foreach (var i in dic){ListViewItem item = newListViewItem();item.SubItems.Add(i[1]);item.Text = i[0];listView1.Items.Add(item);}}catch (Exception ex){label1.Text = ex.Message;}}private void area_up_Scroll(object sender, EventArgs e){try{area_up_value = area_up.Value;area_up_label.Text = area_up_label.Text.Split(':')[0].Replace(" ","")+" : "+ area_up_value;var dic = halconDev.action(threhold_down_value,threhold_up_value,area_down_value,area_up_value,pictureBox1,textBox1.Text);listView1.Items.Clear();foreach (var i in dic){ListViewItem item = newListViewItem();item.SubItems.Add(i[1]);item.Text = i[0];listView1.Items.Add(item);}}catch(Exception ex){label1.Text = ex.Message;}}}}

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

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

相关文章

能否添加背景音乐?后处理功能开发中,支持音频混音导出

能否添加背景音乐&#xff1f;后处理功能开发中&#xff0c;支持音频混音导出 &#x1f3a7; 语音合成的进阶需求&#xff1a;从“能说”到“好听” 当前&#xff0c;基于 Sambert-Hifigan 的中文多情感语音合成系统已实现高质量、低延迟的文本转语音能力。用户可通过 WebUI 或…

技术日报|开源搜索智能体MiroThinker登顶日增803星,Claude记忆插件claude-mem爆发破万二

&#x1f31f; TrendForge 每日精选 - 发现最具潜力的开源项目 &#x1f4ca; 今日共收录 15 个热门项目&#xff0c;涵盖 48 种编程语言 &#x1f310; 智能中文翻译版 - 项目描述已自动翻译&#xff0c;便于理解 &#x1f3c6; 今日最热项目 Top 10 &#x1f947; MiroMindA…

低成本实现语音播报:Sambert-Hifigan+轻量服务器,月成本不足百元

低成本实现语音播报&#xff1a;Sambert-Hifigan轻量服务器&#xff0c;月成本不足百元 引言&#xff1a;中文多情感语音合成的现实需求 在智能客服、有声阅读、教育辅助和IoT设备中&#xff0c;高质量的中文语音合成&#xff08;TTS&#xff09; 正成为提升用户体验的关键能…

为什么90%的大数据项目都栽在数据一致性上?资深架构师总结的避坑指南

为什么90%的大数据项目都栽在数据一致性上?资深架构师总结的避坑指南 一、引言:那个让技术总监拍桌子的“数据对账惨案” 凌晨3点,某电商公司的技术部办公室还亮着灯。数据分析师小王盯着屏幕上的报表,额头上全是汗——昨天的“618大促实时成交额”报表显示是1.2亿,但离…

在 ABAP Cloud 里正确使用系统字段 SYST:从 SY 到 Context 与 XCO 的迁移指南

很多 ABAP 开发者对 SY 这套系统字段又爱又恨:它随处可用、运行时自动刷新,写日志、判定流程、拼消息都很顺手。可一旦进入 ABAP Cloud(包括 SAP BTP 上的 ABAP environment,以及 S/4HANA Cloud 的 ABAP for Cloud Development 语法版本),你会明显感到同一段代码在不同环…

救命神器9个AI论文写作软件,专科生毕业论文格式规范全搞定!

救命神器9个AI论文写作软件&#xff0c;专科生毕业论文格式规范全搞定&#xff01; AI 工具如何成为论文写作的得力助手&#xff1f; 在当前的学术环境中&#xff0c;越来越多的学生开始借助 AI 工具来提升论文写作效率。尤其对于继续教育的学生来说&#xff0c;时间紧张、任务…

在 ABAP Cloud 用 XCO 读取 Call Stack 与 Tenant 信息:把调试线索和云身份带进日志体系

在 ABAP Cloud 的日常开发里,XCO 往往像一把瑞士军刀:它把一些高频、细碎、却又很容易写出坑的能力,封装成了可组合、可读性很强的公共 API。官方对 XCO 的定位也很明确:面向 ABAP 的通用开发库,用来提升开发体验与效率。(SAP Help Portal) 同时,XCO 以模块化方式提供能力…

OCR技术选型:CRNN模型的优势与应用场景

OCR技术选型&#xff1a;CRNN模型的优势与应用场景 &#x1f4d6; 技术背景&#xff1a;OCR文字识别的核心挑战 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;是将图像中的文字内容转化为可编辑文本的关键技术&#xff0c;广泛应用于文档数字化、票…

虚拟串口软件模拟多设备通信:深度剖析机制

一台电脑模拟整条工业总线&#xff1f;揭秘虚拟串口如何“无中生有”构建多设备通信系统你有没有遇到过这样的场景&#xff1a;调试一个Modbus主站程序&#xff0c;却只有单个从设备可用&#xff1b;想验证轮询逻辑&#xff0c;但手头缺了另外两个传感器模块&#xff1b;团队多…

在 ABAP Cloud 时代用好 Key User Apps:扩展更快,也更不容易踩坑

在很多 SAP S/4HANA 项目里,扩展需求来得又快又杂:业务想加字段、想改界面、想插入校验逻辑、想做一张轻量报表,还希望最好别写太多代码、别动核心对象、别影响升级。此时你会发现,ABAP Cloud 并不是唯一解法——系统里那套给关键用户准备的 Key User Extensibility(也常被…

通达信唐能通多响炮公式

{}X1:REF(C,2)>REF(O,2)*1.04 AND REF(C,1)<REF(O,1) AND REF(C,1)>REF(O,1)*0.97 AND C>O*1.04; X2:REF(C,1)>REF(O,2) AND C>REF(C,2); XG:X1 AND X2;

在 Cloud ABAP 中消费 REST API:用 IF_WEB_HTTP_CLIENT + XCO_CP_JSON 跑通 CRUD(附完整示例)

在 SAP 的世界里,大家对 OData 很熟:它基于 HTTP,走 URI,数据常见是 JSON 或 XML,本质上也属于 REST API 的一种实现方式。真正让人头疼的点往往不在 发布,而在 调用——当你需要从 ABAP 程序里去消费外部系统的 API(例如物流、支付、税率、AI 服务、第三方主数据),很…

Sambert-Hifigan镜像安全加固:防止未授权API调用的配置策略

Sambert-Hifigan镜像安全加固&#xff1a;防止未授权API调用的配置策略 &#x1f399;️ 背景与挑战&#xff1a;开放API带来的安全隐患 随着语音合成技术在智能客服、有声阅读、虚拟主播等场景的广泛应用&#xff0c;基于深度学习的TTS&#xff08;Text-to-Speech&#xff0…

MySQL:数据查询-limit

在 MySQL 中&#xff0c;LIMIT 子句用于限制查询结果集中的行数。它非常有用&#xff0c;特别是在处理大量数据时&#xff0c;可以提高性能和响应速度&#xff0c;或在需要分页结果时控制输出的结果数量。 一、基本用法 LIMIT 的基本语法如下&#xff1a; SELECT column1, colu…

“电”击预警!VR跨步电压安全体验系统

一、产品介绍VR跨步电压安全体验系统核心由触摸一体机、一体机及触电行走体验平台构成&#xff0c;是一套集知识科普与实操演练于一体的沉浸式安全培训设备。系统以跨步电压安全为核心&#xff0c;通过“理论学习实景体验”的模式&#xff0c;帮助体验者全面掌握跨步电压相关安…

再发一个据说用好的 可敌国实际到头来被媳妇赶下床的多

{}V1:EMA(C,12); V2:MA(C,50); V3:EMA(C,50); COUNT(CROSS(V1,V2),2) AND COUNT(CROSS(V1,V3),2);

在 ADT 用 ABAP 写自己的 IDE Action:从输入对话框到一键生成类工件

在很多团队里,开发效率的瓶颈往往不是写业务逻辑本身,而是那些重复到让人麻木的脚手架工作:创建类、补接口、配工厂、塞依赖注入器、挂到包里、分配传输请求、激活对象……这些步骤每次都不难,但每次都要做,累积起来就很可观。 IDE Action Framework的出现,把这类工作从…

并发事务带来哪些问题?

并发事务可能导致脏读、不可重复读和幻读。脏读是指一个事务读到了另一个事务未提交的“脏数据”。不可重复读是指在一个事务内多次读取同一数据&#xff0c;由于其他事务的修改导致数据不一致。幻读是指一个事务读取到了其他事务插入的“幻行”。

在 ABAP 环境用 Customer Data Browser 替代 SE16:一套兼顾自助查询与权限合规的数据浏览方案

在传统 ABAP 系统里,业务同事要临时核对数据,很多人会想到 SE16、SE16N、SE16H 这类通用表浏览事务码。到了 SAP BTP 上的 ABAP environment,使用入口从 SAP GUI 转到 Fiori,通用表浏览这件事就变得敏感:一方面,终端用户不再拥有 SAP GUI;另一方面,随便看表 本身在合规…

双气联防技术在下一代储能系统安全预警中的应用

摘要&#xff1a;双气联防技术在下一代储能系统安全预警中的应用本文聚焦储能系统安全防护的前沿技术——基于氢气&#xff08;$H_2$&#xff09;和一氧化碳&#xff08;$CO$&#xff09;的"双气联防"策略。主要内容可概括为&#xff1a;预警机制创新锂电池热失控早期…