入门机器视觉demo之玩转车牌识别**
1. demo介绍
车牌识别这个demo主要是为了检测自己学习的成果。其运用的知识点有blob分析,形态学,ocr训练,ocr识别等等知识点的运用不多说上干货!!
首先是效果图(车牌的是从网上找的如有冒犯麻烦立即修改)
效果图(在茫茫互联网中找到适合自己学习的材料容易贴效果图是为了不耽误大家时间)
2. 代码部分
dev_close_window ()
read_image (Image, 'D:/图片素材/车牌.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 30, 'mono', 'true', 'false')
dev_update_off ()
*需要训练的内容
carArr:=['粤','B','W','3','9','S','5']
*保存ocr文件路径
fttSrc:='D:/halconProject/halcon_ftt_project/车牌ftt.trf'
decompose3 (Image, Image1, Image2, Image3)
trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')
threshold (ImageResult2, Regions, 207, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 18361.7, 19855.8)
fill_up (SelectedRegions, RegionFillUp)
*根据车牌矫正图片位置
orientation_region (RegionFillUp, Phi)
area_center (RegionFillUp, Area, Row, Column)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')
affine_trans_region (RegionFillUp, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*裁剪车牌所在区域 减小干扰
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage)
decompose3 (ImageReduced, Image11, Image21, Image31)
trans_from_rgb (Image11, Image21, Image31, ImageResult11, ImageResult21, ImageResult31, 'hsv')
threshold (ImageResult21, Regions1, 0, 105)
connection (Regions1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, ['area','column'], 'and', [0,327.92], [2000,404.55])
select_shape (ConnectedRegions1, SelectedRegions2, ['area','column'], 'and', [0,447.4], [2000,1000])
union2 (SelectedRegions1, SelectedRegions2, RegionUnion)
connection (RegionUnion, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions3, 'area', 'and', 0, 487.01)
select_shape (RegionUnion, SelectedRegions4, 'column1', 'and', 360.714, 500)
*拿到粤字 和 车牌中的其余字体
union1 (SelectedRegions3, RegionUnion1)
closing_circle (RegionUnion1, RegionClosing, 3)
union2 (RegionClosing, SelectedRegions4, RegionUnion2)
connection (RegionUnion2, ConnectedRegions3)
sort_region (ConnectedRegions3, SortedRegions, 'character', 'true', 'column')
count_obj (ConnectedRegions3, Number)
len:=Number
*遍历每一个区域
for Index2 := 1 to len by 1
select_obj (SortedRegions, ObjectSelected, Index2)
endfor
*创建ftt文件
for Index1 := 1 to len by 1
select_obj (SortedRegions, ObjectSelected, Index1)
append_ocr_trainf (ObjectSelected, ImageAffineTrans, carArr[Index1-1], fttSrc)
*write_ocr_trainf (SortedRegions, ImageAffineTrans,carArr[Index1-1], fttSrc)
endfor
dev_display (ImageResult11)
*加载创建的文件
read_ocr_trainf_names (fttSrc, CharacterNames, CharacterCount)
*创建神经网络分分类器
create_ocr_class_mlp (10, 20, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle1)
*修炼分类器
trainf_ocr_class_mlp (OCRHandle1, fttSrc, 200, 1, 0.01, Error, ErrorLog)
*保存训练好的文件
write_ocr_class_mlp (OCRHandle1, fttSrc)
*识别
read_ocr_class_mlp (fttSrc, OCRHandle)
do_ocr_multi_class_mlp (SortedRegions, ImageReduced, OCRHandle, Class, Confidence)
dev_display (ImageAffineTrans)
for Index := 1 to len by 1
set_tposition (WindowHandle, Row+30, Column-50+(Index*30))
write_string (WindowHandle, Class[Index-1])
endfor
3. 总结
-
在做这个项目中通过阈值分割汉字粤字处理起来比较麻烦在处理这个汉字的时候我才用了分开处理把粤字和其它内容分开通过形态(闭运算closing)学处理把汉字连接起来在通过union1算子把他们都连接起来(上效果图)
阈值分割处理后的图
通过分开处理后的图完整美的把粤字连接起来
为什么要怎么麻烦?因为ocr识别识别的是一个区域(region)在halcon中如果不连接起来就是两个或多个区域不易识别 -
自己训练分类器
自己训练分类器步骤就是 *加载创建的文件 *创建神经网络分分类器 *保存训练好的文件 *ocr(Optical Character Recognition)识别
*创建ftt文件
for Index1 := 1 to len by 1
select_obj (SortedRegions, ObjectSelected, Index1)
append_ocr_trainf (ObjectSelected, ImageAffineTrans, carArr[Index1-1], fttSrc)
*write_ocr_trainf (SortedRegions, ImageAffineTrans,carArr[Index1-1], fttSrc)
endfor
dev_display (ImageResult11)
*加载创建的文件
read_ocr_trainf_names (fttSrc, CharacterNames, CharacterCount)
*创建神经网络分分类器
create_ocr_class_mlp (10, 20, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle1)
*修炼分类器
trainf_ocr_class_mlp (OCRHandle1, fttSrc, 200, 1, 0.01, Error, ErrorLog)
*保存训练好的文件
write_ocr_class_mlp (OCRHandle1, fttSrc)
*识别
read_ocr_class_mlp (fttSrc, OCRHandle)
do_ocr_multi_class_mlp (SortedRegions, ImageReduced, OCRHandle, Class, Confidence)
算子分析
*追加训文字识
append_ocr_trainf (ObjectSelected, ImageAffineTrans, carArr[Index1-1], fttSrc)
*一次性写入所有需要训练的图形
*write_ocr_trainf (SortedRegions, ImageAffineTrans,carArr[Index1-1], fttSrc)
最后就是初学halcon做的小demo,如有不对的地方请大佬指正立即修改,学习路漫漫,加油@~@