1、原始图像
截取自网络图片。
2、Halcon车牌识别完整代码
参考网络代码实现,原始代码无法直接运行,自行修改添加部分程序代码,程序可以正常跑通,并在程序中添加详细注解。
dev_close_window()
read_image (Image, 'E:/机器视觉/软件包/code/LicensePlate.png')
get_image_size(Image, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowID)
dev_display(Image)
*限定车牌识别区域,本例中将裁剪掉上下左右各10%的区域
get_image_pointer1 (Image, Pointer, Type, Width, Height)
gen_rectangle1 (Rectangle, Height*0.1, Width*0.1, Height*0.9, Width*0.9)
reduce_domain (Image, Rectangle, ImageReduced)
*把选中的区域灰度化,方便后续处理
decompose3 (ImageReduced, Red, Green, Blue)
trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')
*灰度阙值过滤,本例中只选中灰度值在100至255之间的区域,可根据实际情况进行相应的设置,然后进行降噪处理
threshold (Saturation, HighSaturation, 100, 255)
remove_noise_region (HighSaturation, OutputRegion, 'n_48')
*根据预定义的车牌长宽比例等查找符合特定特征的区域
connection (OutputRegion, ConnectedRegions1)
closing_rectangle1 (ConnectedRegions1, RegionClosing1, 10, 10)
select_shape (RegionClosing1, ASelectedRegions, 'area', 'and', 3000, 9000)
select_shape (ASelectedRegions, HSelectedRegions, 'height', 'and', 30, 90)
select_shape (HSelectedRegions, SelectedRegions, 'width', 'and', 60, 180)
*呈现出车牌区域的灰度化图像
reduce_domain (Hue, SelectedRegions, HueHighSaturation)
*对上述车牌的精确区域进行阙值过滤,主要是为了去掉车牌周围的黑色边框
threshold (HueHighSaturation, Region, 30, 50)
*填充有字符而没有在上述算法中被选中的内部区域
closing_rectangle1 (Region, RegionFillUp, 20, 20)
*根据选中的上述区域,从原始图片中加载该区域
reduce_domain (ImageReduced, RegionFillUp, TruckTagImage)
*确定识别区域字符的偏移角度,根据摄像机位置的不同其倾斜度也会有所不同(根据分割算法的不同,其实此步骤可以省略)
connection (RegionFillUp, ConnectedReducedRegions)
text_line_orientation (ConnectedReducedRegions, TruckTagImage, 30, -0.523599, 0.523599, OrientationAngle)
*显示真实的车牌位置图像,主要是方便调试
dev_display (TruckTagImage)
*进行字符分割,过滤掉非字符区域
segment_characters (RegionFillUp, TruckTagImage, ImageForeground, RegionForeground, 'local_auto_shape', 'false', 'false', 'medium', 12, 30, 2, 10, UsedThreshold)
select_characters (RegionForeground, RegionCharacters, 'false', 'medium', 12, 30, 'false', 'false', 'variable_width', 'false', 'medium', 'false', 15, 'completion')
closing_rectangle1 (RegionCharacters, RegionCharactersClosing, 1, 2)
*根据各个分割的区域的左上角坐标排序(主要是方便从右向左依次进行字符识别)
connection (RegionCharactersClosing, ConnectedRegionCharactersClosing)
sort_region (ConnectedRegionCharactersClosing, SortedRegions, 'first_point', 'false', 'column')
count_obj(SortedRegions, Number)
*加载字符模板,从右向左依次进行字符识别,并把识别结果绘制到对应字符位置的上方
read_ocr_class_mlp ('D:/program files/MVTec/HALCON-10.0/ocr/Industrial_0-9.omc', OCRHandle)
for Index := 1 to 5 by 1
if(Number >= Index)
* SelectedSortedRegion := SortedRegions[Index]
select_obj(SortedRegions, SelectedSortedRegion, Index)
do_ocr_single_class_mlp (SelectedSortedRegion, ImageReduced, OCRHandle, 1, Class, Confidence)
smallest_rectangle1 (SelectedSortedRegion, Row1, Column1, Row2, Column2)
set_tposition (WindowID, Row1 - 30, (Column2 + Column1) * 0.5 - 5)
write_string (WindowID, Class[0])
dev_display (SelectedSortedRegion)
endif
endfor
if(Number>5)
read_ocr_class_mlp ('D:/program files/MVTec/HALCON-10.0/ocr/Industrial_0-9A-Z.omc', OCRHandle)
* SelectedSortedRegion := SortedRegions[6]
select_obj(SortedRegions, SelectedSortedRegion, 6)
do_ocr_single_class_mlp (SelectedSortedRegion, ImageReduced, OCRHandle, 1, Class, Confidence)
smallest_rectangle1 (SelectedSortedRegion, Row1, Column1, Row2, Column2)
set_tposition (WindowID, Row1 - 30, (Column2 + Column1) * 0.5 - 5)
write_string (WindowID, Class[0])
clear_ocr_class_mlp (OCRHandle)
dev_display (SelectedSortedRegion)
endif
3、识别结果
实测发现识别结果并不理想,存在部分错误。
4、识别算法分析
灰度化:实际就是对原始车牌图片进行预处理,把彩色图片转化为黑白图片,然后对不符合指定阙值范围的灰度值进行过滤。
车牌定位:这是技术难点之一。很多车牌识别的产品都对车牌的定位预留了很多配置参数,例如截取原始图片的位置参数、车牌的长宽比例、大小等等,这些都是为了提高车牌定位的准确率。
字符分割:对定位的车牌位置进行降噪处理、边界模糊、从右向左找出前6个封闭的图形、剩余的封闭图形综合为一个图形进行汉字的识别。
字符识别:就是根据字符模板进行模板匹配,因此需预先建立相应的字符模板。基于图像进行字符识别也可配置很多参数来大大提高字符的识别率。例如限定车牌头的字符,车牌各位字符的识别优先级等等。
上述代码,前三部分实现效果都还可以,最后字符识别还需要再优化,提高识别准确率。