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…...
HTTP/1.1 和 HTTP/2 的区别,HTTP/2 有哪些新特性?
HTTP/1.1 和 HTTP/2 的区别及新特性详解 一、核心区别:连接管理与多路复用 HTTP/1.1 使用「短连接」或「持久连接」,但每个 TCP 连接在同一时刻只能处理一个请求(HOL Blocking)。浏览器通常通过开启多个 TCP 连接(…...
Redis实战篇《黑马点评》8 附近商铺
8.附近商户 8.1GEO数据结构的基本用法 GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据,常见的命令有 GEOADD:添加一个地理空间…...
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡
【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡 开发背景 接下来我们直接打开我们的项目开始进一步操作, 实战开发 导入项目 我把得到的项目解压到本地,我们开…...
通过ollama本地化部署deepseek后,通过API方式请求特别的慢
通过ollama本地化部署deepseek后,通过API方式请求特别的慢 一、现象二、原因分析 一、现象 deepseek火了之后,本地私有化部署大模型的门槛大大降低,即使是在家里的windows电脑,也非常简单就可以安装大模型并且使用,最…...
CSS3中布局方式说明
CSS3 提供了多种灵活的布局方式,适用于不同的场景和需求。以下是主要的布局方式及其特点: 1. Flexbox 布局(弹性盒子) 用途:一维布局(水平或垂直方向排列元素)。特点: 通过 display…...
kafka-web管理工具cmak
一. 背景: 日常运维工作中,采用cli的方式进行kafka集群的管理,还是比较繁琐的(指令复杂?)。为方便管理,可以选择一些开源的webui工具。 推荐使用cmak。 二. 关于cmak: cmak是 Yahoo 贡献的一款强大的 Apac…...
T41LQ专为人工智能物联网(AIoT)应用设计,适用于智能安防、智能家居、机器视觉等领域 软硬件资料+样品测试
君正(Ingenic)T系列芯片涵盖多个型号,每个型号根据不同应用需求提供了多个版本。以下是各型号及其主要版本: 1. T23系列: T23N:标准版,适用于移动摄像机、安全监控、视频通话和视频分析等应用…...
Unity中动态切换光照贴图LightProbe的方法
关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...
考研408数据结构线性表核心知识点与易错点详解(附真题示例与避坑指南)
一、线性表基础概念 1.1 定义与分类 定义:线性表是由n(n≥0)个相同类型数据元素构成的有限序列,元素间呈线性关系。 分类: 顺序表:元素按逻辑顺序存储在一段连续的物理空间中(数组实现&…...
C++基础知识(七)之STL算法、智能指针、文件操作、C++异常、断言
二十一、STL算法 STL提供了很多处理容器的函数模板,它们的设计是相同的,有以下特点: 1)用迭代器表示需要处理数据的区间。 2)返回迭代器放置处理数据的结果(如果有结果)。 3)接受…...
vue3.2响应式优化
Vue 3.2 在响应式方面做了诸多优化,进一步提升了性能,下面为你详细介绍: 1. shallowReactive 和 shallowRef 的性能优势 原理:shallowReactive 和 shallowRef 是浅层响应式 API。shallowReactive 仅对对象的第一层属性进行响应式…...
【Linux】线程概念与控制
线程概念与控制 一.Linux线程概念1.什么是线程?2.分页式存储管理1.虚拟地址和页表的由来2.物理内存管理3.页表4.页目录结构5.两级页表的地址转换6.缺页中断(异常) 3.线程的优点(面试题)4.线程的缺点5.线程异常6.线程用途 二.Linux进程VS线程1.进程和线程2.进程的多个…...
零基础学习Python之循环详解:从入门到实践_我的学习Python记录11
零基础学习Python之循环详解:从入门到实践_我的学习Python记录11 一、前言 最近我在学习Python,发现很多编程概念和用法都让我感到陌生,尤其是循环这个概念。今天,我将分享我学到的循环知识,希望能帮助到和我一样的初…...
电子电路中,正负双电源供电的需求原因
1. 允许信号双向摆动 - **交流信号的处理**:许多电路(如音频放大器、运算放大器)需要处理正负交替变化的交流信号(例如声音信号、传感器输出)。如果仅用单正电源(如12V),信号的“负…...
ROS环境搭建
ROS首次搭建环境 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 一、创建工作空间二、创建ROS包三、注意 注:以下内容都是在已经安装好ros的情况下如何搭建workplace 如果没有安装好,建议鱼香ros一步到位:鱼香ROS 我也是装了好久…...
java后端开发day26--常用API(一)
(以下内容全部来自上述课程) 1.Math 1.简单介绍 是一个帮助我们用于进行数学计算的工具类私有化构造方法,所有的方法都是静态的 2.常用方法 不要背,忘了就查文档。 3.练习题 1.判断一个数是否为质数(优化版&am…...
SpringBoot接口自动化测试实战:从OpenAPI到压力测试全解析
引言:接口测试的必要性 在微服务架构盛行的今天,SpringBoot项目的接口质量直接影响着系统稳定性。本文将分享如何通过自动化工具链实现接口的功能验证与性能压测,使用OpenAPI规范打通测试全流程,让您的接口质量保障体系更加完备。…...
分布式中间件:Redis介绍
目录 Redis 概述 Redis 的特点 高性能 丰富的数据结构 持久化 分布式特性 简单易用 Redis 的数据结构 字符串(String) 哈希(Hash) 列表(List) 集合(Set) 有序集合&…...
Python中文自然语言处理库SnowNLP
SnowNLP 介绍 SnowNLP 是一个基于 Python 的中文自然语言处理库,专为处理中文文本而设计。它受到 TextBlob 的启发,但与 TextBlob 不同的是,SnowNLP 没有使用 NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字…...
Linux-计算机网络.udp
1.收发函数: read()/write () ///通用文件读写,可以操作套接字。 recv(,0) /send(,0) ///TCP 常用套机字读写 recvfrom()/sendto() ///UDP 常用套接字读写 ssize_t recv(int sockfd, void *buf, size_t len, …...
【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法
【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法 🌟 嗨,你好,我是 青松 ! 🌈 自小刺头深草里,而今渐觉出蓬蒿。 文章目录 **01 自动作诗缘起****1. 诗歌自动写作** **02 九歌的模型…...
Docker安装Postgres_16数据库
PostgreSQL简介 PostgreSQL 是一个功能强大、开源的关系型数据库管理系统(RDBMS),以其可靠性、功能丰富性和可扩展性而闻名。它支持复杂的查询、事务完整性、并发控制以及多种数据类型和扩展功能,适用于各种规模的应用程序; 适用传…...
VSCode 移除EmmyLua插件的红色波浪线提示
VSCode 中安装插件EmmyLua,然后打开lua文件的时候,如果lua代码引用了C#脚本的变量,经常出现 “undefined global variable: UnityEngineEmmyLua(undefined-global)” 的红色波浪线提示,这个提示看着比较烦人,我们可以通…...
快慢指针【等分链表、判断链表中是否存在环】
一、等分链表:找到链表的中间节点 Java 实现 class ListNode {int val;ListNode next;ListNode(int val) {this.val val;this.next null;} }public class MiddleOfLinkedList {public ListNode findMiddleNode(ListNode head) {if (head null) {return null;}L…...
doris:阿里云 DLF
阿里云 Data Lake Formation(DLF) 是阿里云上的统一元数据管理服务。兼容 Hive Metastore 协议。 什么是 Data Lake Formation 因此我们也可以和访问 Hive Metastore 一样,连接并访问 DLF。 连接 DLF 创建 DLF Catalog CREATE CATALOG dlf PROPERTIES ("…...
大模型巅峰对决:DeepSeek vs GPT-4/Claude/PaLM-2 全面对比与核心差异揭秘
文章目录 一、架构设计深度解剖1.1 核心架构对比图谱1.2 动态MoE架构实现架构差异分析表 二、训练策略全面对比2.1 训练数据工程对比2.2 分布式训练代码对比DeepSeek混合并行实现GPT-4 Megatron实现对比 2.3 关键训练参数对比 三、性能表现多维评测3.1 基准测试全景对比3.2 推理…...
C语言基础知识02
格式化输入输出 函数名:printf() 格式控制符:%c //把数据转换成字符型 cahr %d //把数据转换为有符号十进制整型 int short %ld // long %f //把数据转成单精度浮点型 flot %d //double %s …...
Linux的进程观:简单性如何成就强大性(三)
1. 环境变量 1.1. 基本概念 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。 如:我们在编写C/C代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接…...
element-ui infiniteScroll 组件源码分享
简单分享 infiniteScroll 组件源码,主要有以下四个方面: 1、infiniteScroll 页面结构。 2、infiniteScroll 组件属性。 3、组件内部的方法。 4、存在的问题。 一、infiniteScroll 页面结构: 二、页面属性。 2.1 infinite-scroll-disab…...

