Halcon 车牌识别-超精细教程

embedded/2025/3/5 21:58:17/

车牌示例

 流程:

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


http://www.ppmy.cn/embedded/170306.html

相关文章

从ETL到数仓分层:大数据处理的“金字塔”构建之道

在当今数据驱动的时代,大数据处理已成为企业决策和业务优化的核心。而ETL(Extract, Transform, Load)作为数据处理的基石,其背后的数仓分层理念更是决定了数据处理的效率与质量。本文将深入探讨ETL工作中的数仓分层理念&#xff0…

HTML第三节

一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

「Selenium+Python自动化从0到1②|2025浏览器操控7大核心API实战(附高效避坑模板))」

Python 自动化操作浏览器基础方法 在进行 Web 自动化测试时&#xff0c;操作浏览器是必不可少的环节。Python 结合 Selenium 提供了强大的浏览器操作功能&#xff0c;让我们能够轻松地控制浏览器执行各种任务。本文将详细介绍如何使用 Python 和 Selenium 操作浏览器的基本方法…

Halcon算子 binary_threshold、auto_threshold、dyn_threshold

算子适用场景特点threshold全局对比度高或均匀光照图像固定阈值、速度快binary_threshold自动计算阈值&#xff08;基于直方图或Otsu&#xff09;自动化、但无法处理光照不均匀dyn_threshold光照不均匀、局部对比度变化动态调整阈值&#xff0c;灵活性强 自动阈值分割 auto_t…

麒麟V10-SP2-x86_64架构系统下通过KVM创建虚拟机及配置虚机的NAT、Bridge两种网络模式全过程

文章目录 一、什么是虚拟化&#xff1f;虚拟化具有哪些优势 二、常见的虚拟化技术1、kvm介绍2、kvm工作原理3、kvm功能 三、安装kvm并启动第一个kvm机器1、环境准备2、安装kvm工具3、启动并设置开机自启 libvirtd 服务4、验证 KVM 模块是否加载5、上传系统镜像到指定目录6、网络…

JWT概念及JAVA使用

前言 JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案 认证方式 认证方式一般有两种 session认证JWT认证 一、session认证 1、步骤 过去&#xff0c;我们都是使用session认证&#xff0c;步骤如下 前端访问登录接口登录接口验证完账号密码没问…

Linux与UDP应用1:翻译软件

UDP应用1&#xff1a;翻译软件 本篇介绍 本篇基于UDP编程接口基本使用中封装的服务器和客户端进行改写&#xff0c;基本功能如下&#xff1a; 从配置文件dict.txt读取到所有的单词和意思客户端向服务端发送英文服务端向客户端发送英文对应的中文意思 配置文件内容 下面的内…

大白话React Hooks(如 useState、useEffect)的使用方法与原理

啥是 React Hooks 在 React 里&#xff0c;以前我们写组件主要用类&#xff08;class&#xff09;的方式&#xff0c;写起来有点复杂&#xff0c;尤其是处理状态和副作用的时候。React Hooks 就是 React 16.8 之后推出的新特性&#xff0c;它能让我们不用写类&#xff0c;直接…