C#Halcon车牌OCR识别

server/2025/2/10 22:34:55/

       在Halcon中,OCR技术主要包括图像预处理、字符分割、模式识别等步骤。这些步骤结合了图像处理技术和人工神经网络技术,以实现对字符的准确识别。

      在进行字符识别之前,需要对图像进行预处理,如倾斜、降噪、滤波、增强、灰度拉伸和二值化等步骤。

     模式识别技术在Halcon中主要涉及训练OCR分类器和读取特征。Halcon提供了多种分类器,如多层神经网络(MLP)、支持向量机(SVM)、K-最邻近(K-NN)和高斯混合类型(GMM)。训练OCR分类器涉及到生成训练文件(.trf),创建训练器,训练分类器,保存分类器,以及字符识别。

Demo效果

一,OCR训练

1,加载图像及绘制ROI

鉴于图像情况个人建议可以采用

create_drawing_object_rectangle2  ||  draw_rectangle2   ||   draw_rectangle2_mod进行封装

2,提取ROI

阈值分割-区域膨胀-条件筛选-区域联合

3,仿射变换

HOperatorSet.VectorAngleToRigid

HOperatorSet.AffineTransImage

HOperatorSet.AffineTransRegion

4,分割字符区域

HOperatorSet.PartitionRectangle

5,执行训练

private void btn_trainf_Click(object sender, EventArgs e)
{HTuple hv_FileExists = new HTuple(), hv_TrainFile = new HTuple(), hv_HandleFile = new HTuple();HTuple hv_Words = new HTuple(), hv_Index = new HTuple();HTuple hv_CharacterNames = new HTuple(), hv_CharacterCount = new HTuple();HTuple hv_OCRHandle = new HTuple(), hv_Error = new HTuple();HTuple hv_ErrorLog = new HTuple();HObject ho_ObjectSelected = null;HOperatorSet.GenEmptyObj(out ho_ObjectSelected);//创建训练文件hv_TrainFile.Dispose();hv_TrainFile = tBx_TrainFile.Text + ".try";hv_Words.Dispose();hv_Words = new HTuple();string s = tBx_words.Text;var param = s.Split(new char[] { ',' });for (int i = 0; i < param.Length; i++){hv_Words[i] = param[i];}//对照字符区域,图片,以及字符进行训练for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_Words.TupleLength())) - 1); hv_Index = (int)hv_Index + 1){ho_ObjectSelected.Dispose();HOperatorSet.SelectObj(ho_SortedRegions, out ho_ObjectSelected, hv_Index + 1);HOperatorSet.AppendOcrTrainf(ho_ObjectSelected, ho_ImageAffineTrans, hv_Words.TupleSelect(hv_Index), hv_TrainFile);}//读取训练文件hv_CharacterNames.Dispose(); hv_CharacterCount.Dispose();HOperatorSet.ReadOcrTrainfNames(hv_TrainFile, out hv_CharacterNames, out hv_CharacterCount);//创建、训练一个分类识别器hv_OCRHandle.Dispose();HOperatorSet.CreateOcrClassMlp(10, 10, "constant", "default", hv_CharacterNames,80, "none", 10, 42, out hv_OCRHandle);hv_Error.Dispose(); hv_ErrorLog.Dispose();HOperatorSet.TrainfOcrClassMlp(hv_OCRHandle, hv_TrainFile, 200, 1, 0.1, out hv_Error, out hv_ErrorLog);hv_HandleFile.Dispose();hv_HandleFile = tBx_TrainFile.Text + ".omc";//保存分类识别文件HOperatorSet.WriteOcrClassMlp(hv_OCRHandle, hv_HandleFile);}

二,验证


read_image(Image,'E:/vs/车牌识别/IMage/1.png')
rgb1_to_gray(Image, GrayImage)
*筛选车牌区域
mean_image (GrayImage, ImageMean, 19, 19)
dyn_threshold (GrayImage, ImageMean, RegionDynThresh, 5, 'light')
connection (RegionDynThresh, ConnectedRegions1)
fill_up (ConnectedRegions1, RegionFillUp)
select_shape (RegionFillUp, SelectedRegions1, 'area', 'and', 24000, 25000)
shape_trans (SelectedRegions1, Rectangle1, 'convex')
erosion_circle (Rectangle1, Rectangle, 9.5)
reduce_domain (GrayImage, Rectangle, ImageReduced)
*获取车牌中心
area_center(Rectangle, Area, Row, Column)
*阈值处理提取文字
threshold (ImageReduced, Regions1, 179, 245)
dilation_rectangle1 (Regions1, RegionDilation, 4, 4)
*区域拆分:拆开像素值不同的区域
connection (RegionDilation, ConnectedRegions)
*形状选择
select_shape (ConnectedRegions, SelectedRegions, ['area','row'], 'and', [500,Row-15], [35752.7,Row+15])
*联合区域:与connection相反
union1 (SelectedRegions, RegionUnion)
*带方向的矩形
shape_trans (RegionUnion, RegionTrans, 'rectangle2')
orientation_region (RegionTrans, Phi)
*3.生成仿射变换矩阵
vector_angle_to_rigid(Row, Column,Phi, Row, Column, 0, HomMat2D)
affine_trans_image (GrayImage, ImageAffineTrans, HomMat2D, 'constant', 'false')
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
affine_trans_region (Regions1, Region1AffineTrans, HomMat2D, 'nearest_neighbor')
*抠图
reduce_domain(ImageAffineTrans, RegionAffineTrans, ImageReduced)
dev_set_draw ('margin')
partition_rectangle (RegionAffineTrans, Partitioned,36, 65)
*求交集
intersection (Partitioned, Region1AffineTrans, RegionIntersection)
*对区域排序
sort_region(RegionIntersection,SortedRegions,'character','true','column')set_display_font (WindowHandle, 30, 'mono', 'true', 'false')read_ocr_class_mlp ('chepai.omc', OCRHandle)
count_obj (SortedRegions, Number1)
text := ''
for Index := 1 to Number1 by 1select_obj (SortedRegions, tempRegion, Index)do_ocr_single_class_mlp (tempRegion, ImageReduced, OCRHandle, 1, Class, Confidence)text := text + Class
endfor


http://www.ppmy.cn/server/166592.html

相关文章

电脑远程控制vivo手机,切换按钮就能让vivo仅投屏、不受控制!

Linux系统在全球的市场份额并不高&#xff0c;继而很多便捷的软件都没有Linux的版本。如果想要用Linux远程控制安卓手机&#xff0c;找软件会比较麻烦&#xff0c;但是AirDroid网页版可以做到。 以vivo手机为例子&#xff0c;接下来讲解Linux系统电脑要远程控制安卓手机时&…

视觉硬件选型和算法选择(CNN)

基础知识 什么是机械视觉: 机械视觉是一种利用机器代替人眼来进行测量和判断的技术&#xff0c;通过光学系统、图像传感器等设备获取图像&#xff0c;并运用图像处理和分析算法来提取信息&#xff0c;以实现对目标物体的识别、检测、测量和定位等功能。 机械视觉与人类视觉有什…

知识库升级新思路:用生成式AI打造智能知识助手

在当今信息爆炸的时代&#xff0c;企业和组织面临着海量数据的处理和管理挑战。知识库管理系统&#xff08;Knowledge Base Management System, KBMS&#xff09;作为一种有效的信息管理工具&#xff0c;帮助企业存储、组织和检索知识。然而&#xff0c;传统的知识库系统往往依…

Lisp语言的测试开发

Lisp语言的测试开发探讨 Lisp语言是一种具有悠久历史的编程语言&#xff0c;最早在1958年被创建&#xff0c;并通过其独特的语法和强大的功能在编程领域占据了一席之地。尽管在市场占有率上&#xff0c;Lisp与其他主流语言如Java、Python、C等相比略显逊色&#xff0c;但它在人…

C语言【基础篇】之数组——解锁多维与动态数组的编程奥秘

数组 &#x1f680;前言&#x1f99c;数组的由来与用途&#x1f31f;一维数组详解&#x1f58a;️二维数组进阶&#x1f4af;动态数组原理&#x1f914;常见误区扫盲&#x1f4bb;学习路径建议✍️总结 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。本文收录于我的专…

android的DataBinding的使用

参考&#xff1a; Android基础入门&#xff1a;dataBinding的简单使用 Android DataBinding的使用

如何在Vscode中接入Deepseek

一、获取Deepseek APIKEY 首先&#xff0c;登录Deepseek官网的开放平台&#xff1a;DeepSeek 选择API开放平台&#xff0c;然后登录Deepseek后台。 点击左侧菜单栏“API keys”&#xff0c;并创建API key。 需要注意的是&#xff0c;生成API key复制保存到本地&#xff0c;丢失…

等待时间问题(C++)

代码&#xff1a; // // Created by LWJ on 2024-11-07 9:01. // #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {// 输入顾客数量和每个顾客的服务时间&#xff1a;int n;cout << "请输入顾客数…