当前位置: 首页 > news >正文

Halcon 车牌识别-超精细教程

车牌示例

 流程:

  • 读取图片转灰度图
  • 阈值分割,找车牌内容
  • 将车牌位置设置变换区域形状
  • 找到中心点和弧度
  • 利用仿射变换,斜切
  • 车牌旋转转正,把车牌抠出来
  • 利用形态学操作
  • 拼接车牌号数字
  • 训练ocr开始识别中文车牌

 本文章用到的算子(解析)

Halcon 算子-承接车牌识别-CSDN博客

rgb1_to_gray  转灰度图

threshold  阈值分割

connection  将图像进行分割多张

select_shape  特征阈值

shape_trans   变换区域形状

area_center    取区域面积和中心

orientation_region   区域方向

vector_angle_to_rigid  计算平移和旋转仿射变换关系的变换矩阵

hom_mat2d_slant   斜切

affine_trans_region  仿射变换区域

affine_trans_Image  图像仿射变换

reduce_domain    取域图像

opening_circle   使用圆形结构的开运算

sort_region     排序区域

select_obj        选中组中对象

union2             计算两区域并集

gen_empty_oj    创建空对象

concat_obj        合并元组

write_ocr_trainf     写OCR训练文件

read_ocr_trainf_names   读OCR训练文件名

create_ocr_class_mlp      创建OCR多层感知器

trainf_ocr_class_mlp        从文件训练OCR多层感知器

write_ocr_class_mlp        写OCR多层感知器

read_ocr_class_mlp       读OCR多层感知器

do_ocr_multi_class_mlp   执行OCR多层感知器多分类

set_tposition            设置文本光标位置

 1、关闭数据、窗体

dev_update_off ()
dev_close_window ()

2、读取图片、打开窗体

read_image (Image, 'F:/Halcon/‫Image/车牌.jpg')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)

3、处理图片-find车牌

rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 76, 100)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 8600, 10000)

 效果   threshold    connection      select_shape

 4、处理图片-变换区域形状

shape_trans (SelectedRegions, RegionTrans, 'rectangle2')

5、取区域面积和中心

area_center (RegionTrans, Area, Row, Column)

6、旋转仿射变换、斜切、旋转、抠图

orientation_region (RegionTrans, Phi)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(0), HomMat2D)
hom_mat2d_slant (HomMat2D, rad(15), 'x', Column, Row, HomMat2DSlant)
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2DSlant, 'nearest_neighbor')
affine_trans_image (Image, ImageAffineTrans, HomMat2DSlant, 'constant', 'false')
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)

效果:  斜切区域   斜切图像   旋转纠正后区域

 7、转灰度图,进行形态学操作,阈值操作,进行排序

rgb1_to_gray (ImageReduced, GrayImage1)
threshold (GrayImage1, Regions1, 172, 255)
opening_circle (Regions1, RegionOpening, 1.5)
closing_circle (Regions, RegionClosing, 1.7) 注意这个知识做个对比
connection (RegionOpening, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 19.97, 600)
sort_region (SelectedRegions1, SortedRegions, 'character', 'true', 'column')

 

 这是分成多区域的苏字也被分割多个了,所以下面要进行合并

8、组装车牌号苏字

select_obj (SortedRegions, ObjectSelected1, 1)
select_obj (SortedRegions, ObjectSelected2, 2)
select_obj (SortedRegions, ObjectSelected3, 3)
union2 (ObjectSelected1, ObjectSelected2, RegionUnion)
union2 (RegionUnion, ObjectSelected3, RegionUnion1)
select_obj (SortedRegions, ObjectSelected4, 4)
select_obj (SortedRegions, ObjectSelected5, 5)
select_obj (SortedRegions, ObjectSelected6, 6)
select_obj (SortedRegions, ObjectSelected7, 7)
select_obj (SortedRegions, ObjectSelected8, 8)
select_obj (SortedRegions, ObjectSelected9, 9)

 

 

9、将上面零散的车牌号进行拼接

gen_empty_obj (EmptyObject)
concat_obj (EmptyObject, RegionUnion1, EmptyObject)
concat_obj (EmptyObject, ObjectSelected4, EmptyObject)
concat_obj (EmptyObject, ObjectSelected5, EmptyObject)
concat_obj (EmptyObject, ObjectSelected6, EmptyObject)
concat_obj (EmptyObject, ObjectSelected7, EmptyObject)
concat_obj (EmptyObject, ObjectSelected8, EmptyObject)
concat_obj (EmptyObject, ObjectSelected9, EmptyObject)

 

 10、创建训练文件并读取

TrainFile:='./Charactor.trf'
Words:=['苏','E','C','6','2','N','8']
write_ocr_trainf (EmptyObject, GrayImage1, Words, TrainFile)
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
create_ocr_class_mlp (8, 10, 'constant', 'default',  CharacterNames, 80, 'none', 10, 42, OCRHandle)
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)

11、训练omc开始识别

read_ocr_class_mlp ('./Charactor.omc', OCRHandle1)
do_ocr_multi_class_mlp (EmptyObject, GrayImage1, OCRHandle1, Class, Confidence)
dev_clear_window ()
dev_set_color ('red')
set_display_font (WindowHandle,30, 'mono', 'true', 'false')
for Index:=0 to |Class|-1 by 1set_tposition (WindowHandle, 30, 120+40*Index)write_string (WindowHandle, Class[Index]) 
endfor


全部代码 

dev_update_off ()
dev_close_window ()
*读取图片
read_image (Image, 'F:/Halcon/‫Image/车牌.jpg')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
* 处理图片 - 定位车牌
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 76, 100)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 8600, 10000)
* 处理图像-转正
shape_trans (SelectedRegions, RegionTrans, 'rectangle2')
* 找到中心点
area_center (RegionTrans, Area, Row, Column)
*找弧度
orientation_region (RegionTrans, Phi)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(0), HomMat2D)
hom_mat2d_slant (HomMat2D, rad(15), 'x', Column, Row, HomMat2DSlant)
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2DSlant, 'nearest_neighbor')
affine_trans_image (Image, ImageAffineTrans, HomMat2DSlant, 'constant', 'false')
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)
* 开始识别 图片处理    苏字拼接
rgb1_to_gray (ImageReduced, GrayImage1)
threshold (GrayImage1, Regions1, 172, 255)
opening_circle (Regions1, RegionOpening, 1.5)
closing_circle (Regions, RegionClosing, 1.7)
connection (RegionOpening, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 19.97, 600)
sort_region (SelectedRegions1, SortedRegions, 'character', 'true', 'column')
* 组装苏字区域
select_obj (SortedRegions, ObjectSelected1, 1)
select_obj (SortedRegions, ObjectSelected2, 2)
select_obj (SortedRegions, ObjectSelected3, 3)
union2 (ObjectSelected1, ObjectSelected2, RegionUnion)
union2 (RegionUnion, ObjectSelected3, RegionUnion1)
select_obj (SortedRegions, ObjectSelected4, 4)
select_obj (SortedRegions, ObjectSelected5, 5)
select_obj (SortedRegions, ObjectSelected6, 6)
select_obj (SortedRegions, ObjectSelected7, 7)
select_obj (SortedRegions, ObjectSelected8, 8)
select_obj (SortedRegions, ObjectSelected9, 9)
**把所有区域保存一个对象
gen_empty_obj (EmptyObject)
concat_obj (EmptyObject, RegionUnion1, EmptyObject)
concat_obj (EmptyObject, ObjectSelected4, EmptyObject)
concat_obj (EmptyObject, ObjectSelected5, EmptyObject)
concat_obj (EmptyObject, ObjectSelected6, EmptyObject)
concat_obj (EmptyObject, ObjectSelected7, EmptyObject)
concat_obj (EmptyObject, ObjectSelected8, EmptyObject)
concat_obj (EmptyObject, ObjectSelected9, EmptyObject)
****创建训练文件
TrainFile:='./Charactor.trf'
Words:=['苏','E','C','6','2','N','8']
* 完成图像与字符训练对应关系
write_ocr_trainf (EmptyObject, GrayImage1, Words, TrainFile)
* 读取训练文件
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
* 创建一个分类识别器
create_ocr_class_mlp (8, 10, 'constant', 'default',  CharacterNames, 80, 'none', 10, 42, OCRHandle)
* 训练分类识别器
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
* 保存分类文件
*write_ocr_class_mlp (OCRHandle, './Charactor.omc')
**训练omc开始识别带中文车牌
read_ocr_class_mlp ('./Charactor.omc', OCRHandle1)
do_ocr_multi_class_mlp (EmptyObject, GrayImage1, OCRHandle1, Class, Confidence)
dev_clear_window ()
dev_set_color ('red')
set_display_font (WindowHandle,30, 'mono', 'true', 'false')
for Index:=0 to |Class|-1 by 1set_tposition (WindowHandle, 30, 120+40*Index)write_string (WindowHandle, Class[Index]) 
endfor

相关文章:

Halcon 车牌识别-超精细教程

车牌示例 流程: 读取图片转灰度图阈值分割,找车牌内容将车牌位置设置变换区域形状找到中心点和弧度利用仿射变换,斜切车牌旋转转正,把车牌抠出来利用形态学操作拼接车牌号数字训练ocr开始识别中文车牌 本文章用到的算子(解析) Halcon 算子-承接车牌识别-CSDN博客 rgb1_to_gray…...

LeetCode 25 - K 个一组翻转链表

LeetCode 25 - K 个一组翻转链表 这道题是一个典型的链表操作题,考察我们对链表的精确操作,包括反转链表、分组处理、递归和迭代的结合应用等。还可以通过变体问题延伸到优先队列操作、归并、分块等,这使得它成为面试中的高频考题之一。 题目…...

一文读懂智能硬件定位:开启智能时代的精准导航

一、智能硬件定位是什么 (一)基本概念阐述 智能硬件定位,本质上是智能硬件依托一系列特定技术手段,精准测定自身所处地理位置的过程。这一实现过程离不开诸多关键技术的支撑。传感器堪称其中的 “排头兵”,像加速度计…...

夸父工具箱(安卓版) 手机超强工具箱

如今,人们的互联网活动日益频繁,导致手机内存即便频繁清理,也会莫名其妙地迅速填满,许多无用的垃圾信息悄然占据空间。那么,如何有效应对这一难题呢?答案就是今天新推出的这款工具软件,它能从根…...

Html5学习教程,从入门到精通,HTML5 列表语法知识点及案例代码(11)

HTML 列表语法知识点及案例代码 一、HTML 列表类型 HTML 提供了三种列表类型&#xff1a; 无序列表 (Unordered List)&#xff1a;使用 <ul> 标签定义&#xff0c;列表项使用 <li> 标签定义。默认情况下&#xff0c;列表项前面会显示黑色圆点。有序列表 (Ordere…...

内核进程调度队列(linux的真实调度算法) ─── linux第13课

目录 内核进程调度队列的过程 一个CPU拥有一个runqueue(运行队列在内存) 活动队列(active) 过期队列(expired) active指针和expired指针 重绘runqueue linux内核O(1)调度算法 总结 补充知识: 封装链式结构的目的是: 仅使用封装链式结构可以得到全部的task_struct的信…...

16.7 LangChain LCEL 极简入门:Prompt + LLM 的黄金组合

LangChain LCEL 极简入门:Prompt + LLM 的黄金组合 关键词:LCEL 基础示例、Prompt 模板设计、LLM 集成、链式调用、LangChain 快速上手 1. 基础架构解析:Prompt → LLM → Output 1.1 核心组件交互流程 #mermaid-svg-pv3fH3mEKyE4TNaF {font-family:"trebuchet ms&qu…...

Spring线程池学习笔记

Spring提供了多种方式来配置和使用线程池&#xff0c;最常见的是通过TaskExecutor和ThreadPoolTaskExecutor。 Spring线程池 TaskExecutor 接口 TaskExecutor 是Spring框架中的一个接口&#xff0c;它是对Java的Executor接口的简单封装。它的主要目的是为了提供一个统一的接口…...

ArcGIS操作:08 计算shp面积并添加到属性表

1、打开属性表 注意&#xff1a;计算面积前&#xff0c;需要把shp的坐标系转化为投影坐标系&#xff08;地理坐标系用于定位、投影坐标系用于测量&#xff09; 2、创建字段 3、编辑字段名、类型 4、选择字段&#xff0c;计算几何 5、选择属性、坐标系、单位...

安卓音频框架混音器

在 Android 音频框架中&#xff0c;混音器&#xff08;Mixer&#xff09; 是 AudioFlinger 服务的核心组件之一&#xff0c;负责将多个音频流&#xff08;来自不同应用或系统组件&#xff09;混合为统一的输出流&#xff0c;再传输到音频硬件设备&#xff08;如扬声器、耳机等&…...

左值引用与指针的区别

很多朋友遇到过这个问题&#xff1a;左值引用与指针有哪些区别&#xff1f;脑子里闪过很多答案&#xff0c;但大部分都是各自的定义&#xff0c;真要说他们两个有什么区别&#xff0c;有的时候还这是说不上来。本文针对这个问题进行归纳总结&#xff0c;希望对大家有所帮助。 …...

Linux基础使用和程序部署

目录 1.Linux 1.2 Linux的环境搭配 1.2.1 使用云服务器 1.2.2使用终端软件连接到Linux 1.3. Linux 常用命令 1. ls&#xff1a;列出当前目录中的文件和子目 2.pwd&#xff1a;显示当前工作目录的路径 3.cd&#xff1a;改变工作目录&#xff0c;将当前的工作目录改变到指定目…...

Linux驱动开发之串口驱动移植

原理图 从上图可以看到RS232的串口接的是UART3&#xff0c;接下来我们需要使能UART3的收发功能。一般串口的驱动程序在内核中都有包含&#xff0c;我们配置使能适配即可。 设备树 复用功能配置 查看6ull如何进行uart3的串口复用配置&#xff1a; 设备树下添加uart3的串口复用…...

计算机毕业设计SpringBoot+Vue.js美食推荐系统商城(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

指针小节.

....指针的第四个作用&#xff1a;函数的结果和计算状态分开 高级指针。。 指针中的数据类型&#xff1a;获取字节数据的个数。步长&#xff1a;指针移动一次的字节个数&#xff08;int&#xff0c;long。。。各自字节都不同&#xff09; 加减都可以...

[Qt5] QJson数据之间的转换以及QByteArray图像数据压缩

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…...

2025年能源工作指导意见

2025年是“十四五”规划收官之年&#xff0c;做好全年能源工作意义重大。为深入贯彻落实党中央、国务院决策部署&#xff0c;以能源高质量发展和高水平安全助力我国经济持续回升向好&#xff0c;满足人民群众日益增长的美好生活用能需求&#xff0c;制定本意见。 一、总体要求…...

Android 获取jks的SHA1值:java.io.IOException: Invalid keystore format

命令生成 keytool -list -v -keystore 全路径.jks -alias 别名 -storepass 密码 -keypass 密码 1、遇到 的问题&#xff1a; 通过快捷键 ‘win r’ 启动的小黑框运行上面的命令会出现下面这个错误keytool 错误: java.io.IOException: Invalid keystore format 2、解决问题 …...

深入探索像ChatGPT这样的大语言模型-02-POST training supervised finetuning

参考 【必看珍藏】2月6日&#xff0c;安德烈卡帕西最新AI普及课&#xff1a;深入探索像ChatGPT这样的大语言模型&#xff5c;Andrej Karpathy fineweb知乎翻译介绍 fineweb-v1原始连接 fineweb中文翻译版本 Chinese Fineweb Edu数据集 查看网络的内部结果&#xff0c;可以参…...

广义线性模型下的数据分析(R语言)

一、实验目的&#xff1a; 通过上机试验&#xff0c;掌握利用R实现线性回归分析、逻辑回归、列联分析及方差分析&#xff0c;并能对分析结果进行解读。 数据&#xff1a; 链接: https://pan.baidu.com/s/1JqZ_KbZJEk-pqSUWKwOFEw 提取码: hxts 二、实验内容&#xff1a; 1、2…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...