在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