Halcon实战之车牌识别

车牌识别是生活中随处可见的应用,目前已经相当成熟。而今天我们讨论的是比较单一的应用场景,即静态场景,仅供学习参考。

给出一张车牌图片,当然你可以拿起你的手机对着一辆车随意拍一张。


图片选择的是稍微有所倾斜的一张,这样便于我们对矫正定位有更清晰的认识。

车牌识别的套路也不复杂,可能根据应用场景不同,需要加上一些特殊的处理。一般分三步走:

1.定位:明确目标对象

2.校正:角度位置上的处理,将图像或者区域摆正

3.识别:ocr字符识别

我们重点关注图像校正,一般采用仿射变换处理。需要求出单位矩阵,缩放矩阵,旋转矩阵,平移矩阵等其中一种或多种,然后将及其作用于区域或者图像。

仿射变换步骤:

*求角度
orientation_region (RegionTrans, Phi)
*求区域面积,旋转坐标
area_center (RegionTrans, Area, Row, Column)
*求旋转矩阵--仿射变换矩阵
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
*旋转区域,旋转图像
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'false')
affine_trans_image (Decliningcarno, ImageAffinTrans, HomMat2D, 'constant', 'false')
*截取区域 图像Image相对于Region区域的图像
reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced)
我们先将一幅rgb三通道图像转换为3幅单通道图像,然后rgb空间转hsv空间,再对H分量作灰度分析提取 ,得到如下图



开运算去椒盐噪点



再进行形态学处理,仿射变换,最后利用halcon自带的一些mlp文件进行识别,read_ocr_class_mlp



完整代码及详细讲解如下:

dev_close_window ( )
dev_open_window_fit_size (0, 0, 640, 480, -1, -1, WindowHandle)

read_image (Decliningcarno, 'E:/SVN/Gavin/Learn/HalconHelp/photos/decliningCarNo.png')
*将一幅rgb三通道图像转换为3幅单通道图像
decompose3 (Decliningcarno, Red, Green, Blue)

*rgb空间转hsv空间
trans_from_rgb (Red, Green, Blue, ImageResult_H, ImageResult_S, ImageResult_V, 'hsv')
*对H分量作灰度分析提取 
threshold (ImageResult_S, Regions, 223, 255)
*开运算去椒盐噪点
opening_rectangle1 (Regions, RegionOpening, 2, 2)
*填充孔洞
fill_up (RegionOpening, RegionFillUp)
*断成不同的连通域
connection (RegionFillUp, ConnectedRegions)
*特征选择
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 7096.33, 9199)
*形状转换 使用凸性或外接矩形都可以
shape_trans (SelectedRegions, RegionTrans, 'rectangle2')
*求角度
orientation_region (RegionTrans, Phi)
*求区域面积,旋转坐标
area_center (RegionTrans, Area, Row, Column)
*求旋转矩阵--仿射变换矩阵
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
*旋转区域,旋转图像
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'false')
affine_trans_image (Decliningcarno, ImageAffinTrans, HomMat2D, 'constant', 'false')
*截取区域 图像Image相对于Region区域的图像
reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced)
*图像取反,由于识别用到训练字库都是暗字体
invert_image (ImageReduced, ImageInvert)
*转灰度图像
rgb1_to_gray (ImageReduced, GrayImage)
*灰度处理
threshold (GrayImage, Regions1, 123, 194)
connection (Regions1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 172.99, 448)
sort_region (SelectedRegions1, SortedRegions, 'character', 'true', 'column')
*读取
read_ocr_class_mlp ('Industrial_0-9A-Z.omc', OCRHandle)
*
do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)
disp_message (WindowHandle, Class, 'window', 150, 150, 'black', 'true')





  • 11
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是一个简单的Halcon程序,可以实现车牌识别的基本功能,供您参考: ``` load_image (Image, 'car_plate.jpg') // 加载车牌图像 // 车牌定位 reduce_domain (Image, PlateRegion, 0, 0, 500, 200) // 缩小图像范围 set_rgb (PlateRegion, 0, 255, 0) // 在缩小后的图像上标记出车牌区域 gen_rectangle1 (Rectangle, 50, 20, 120, 60) // 定义一个矩形模板 find_shape_model (PlateRegion, Rectangle, PlateModelID, PlatePose, 0.5, 1, 0.5, 'use_polarity') // 寻找匹配的矩形模板 get_shape_model_contours (PlateModelContours, PlateModelID, 1) // 获取匹配的轮廓 // 车牌字符分割 reduce_domain (Image, PlateImage, PlatePose) // 根据车牌位置裁剪图像 threshold (PlateImage, BinaryImage, 128, 255) // 二值化处理 opening_circle (BinaryImage, BinaryImage, 3.5) // 形态学开运算 connection (BinaryImage, ConnectedRegions) // 连通区域分析 select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 10000) // 根据面积选取候选字符 count_obj (SelectedRegions, NumCharacters) // 统计候选字符数量 gen_region_contour (CharacterContours, SelectedRegions, 'border') // 获取候选字符的轮廓 // 字符识别 read_string (ConfigFile, 'svm') // 读取支持向量机模型参数 svm_restore (SVMHandle, ConfigFile) // 恢复支持向量机模型 for i := 1 to NumCharacters select_obj (SelectedRegions, Character, i) // 获取第i个候选字符 reduce_domain (BinaryImage, CharacterImage, Character) // 根据候选字符位置裁剪图像 reduce_domain (PlateImage, CharacterPlateImage, Character) // 根据候选字符位置裁剪车牌图像 features := character_features (CharacterPlateImage) // 提取候选字符的特征 svm_classify (SVMHandle, features, Score) // 使用支持向量机模型进行分类 if Score > 0.5 then append_string (PlateNumber, char_int (i + 48)) // 将识别结果添加到车牌号码中 endif endfor // 输出识别结果 write_string (PlateNumber) ``` 需要注意的是,上述程序仅供参考,实际应用中需要根据具体情况进行调整和优化。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值