車牌示例
?流程:
- 讀取圖片轉灰度圖
- 閾值分割,找車牌內容
- 將車牌位置設置變換區域形狀
- 找到中心點和弧度
- 利用仿射變換,斜切
- 車牌旋轉轉正,把車牌摳出來
- 利用形態學操作
- 拼接車牌號數字
- 訓練ocr開始識別中文車牌
?本文章用到的算子(解析)
Halcon 算子-承接車牌識別-CSDN博客
rgb1_to_gray? 轉灰度圖threshold? 閾值分割
connection? 將圖像進行分割多張
select_shape? 特征閾值
shape_trans? ?變換區域形狀
area_center? ? 取區域面積和中心
orientation_region? ?區域方向
vector_angle_to_rigid? 計算平移和旋轉仿射變換關系的變換矩陣
hom_mat2d_slant? ?斜切
affine_trans_region? 仿射變換區域
affine_trans_Image? 圖像仿射變換
reduce_domain? ? 取域圖像
opening_circle? ?使用圓形結構的開運算
sort_region? ? ?排序區域
select_obj? ? ? ? 選中組中對象
union2? ? ? ? ? ? ?計算兩區域并集
gen_empty_oj? ? 創建空對象
concat_obj? ? ? ? 合并元組
write_ocr_trainf? ? ?寫OCR訓練文件
read_ocr_trainf_names? ?讀OCR訓練文件名
create_ocr_class_mlp? ? ? 創建OCR多層感知器
trainf_ocr_class_mlp? ? ? ? 從文件訓練OCR多層感知器
write_ocr_class_mlp? ? ? ? 寫OCR多層感知器
read_ocr_class_mlp? ? ? ?讀OCR多層感知器
do_ocr_multi_class_mlp? ?執行OCR多層感知器多分類
set_tposition? ? ? ? ? ? 設置文本光標位置
?1、關閉數據、窗體
dev_update_off ()
dev_close_window ()
2、讀取圖片、打開窗體
read_image (Image, 'F:/Halcon/?Image/車牌.jpg')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
3、處理圖片-find車牌
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 76, 100)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 8600, 10000)
?效果? ?threshold? ? connection? ? ? select_shape
?4、處理圖片-變換區域形狀
shape_trans (SelectedRegions, RegionTrans, 'rectangle2')
5、取區域面積和中心
area_center (RegionTrans, Area, Row, Column)
6、旋轉仿射變換、斜切、旋轉、摳圖
orientation_region (RegionTrans, Phi)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(0), HomMat2D)
hom_mat2d_slant (HomMat2D, rad(15), 'x', Column, Row, HomMat2DSlant)
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2DSlant, 'nearest_neighbor')
affine_trans_image (Image, ImageAffineTrans, HomMat2DSlant, 'constant', 'false')
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)
效果:? 斜切區域? ?斜切圖像? ?旋轉糾正后區域
?7、轉灰度圖,進行形態學操作,閾值操作,進行排序
rgb1_to_gray (ImageReduced, GrayImage1)
threshold (GrayImage1, Regions1, 172, 255)
opening_circle (Regions1, RegionOpening, 1.5)
closing_circle (Regions, RegionClosing, 1.7) 注意這個知識做個對比
connection (RegionOpening, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 19.97, 600)
sort_region (SelectedRegions1, SortedRegions, 'character', 'true', 'column')
?
?這是分成多區域的蘇字也被分割多個了,所以下面要進行合并
8、組裝車牌號蘇字
select_obj (SortedRegions, ObjectSelected1, 1)
select_obj (SortedRegions, ObjectSelected2, 2)
select_obj (SortedRegions, ObjectSelected3, 3)
union2 (ObjectSelected1, ObjectSelected2, RegionUnion)
union2 (RegionUnion, ObjectSelected3, RegionUnion1)
select_obj (SortedRegions, ObjectSelected4, 4)
select_obj (SortedRegions, ObjectSelected5, 5)
select_obj (SortedRegions, ObjectSelected6, 6)
select_obj (SortedRegions, ObjectSelected7, 7)
select_obj (SortedRegions, ObjectSelected8, 8)
select_obj (SortedRegions, ObjectSelected9, 9)
?
?
9、將上面零散的車牌號進行拼接
gen_empty_obj (EmptyObject)
concat_obj (EmptyObject, RegionUnion1, EmptyObject)
concat_obj (EmptyObject, ObjectSelected4, EmptyObject)
concat_obj (EmptyObject, ObjectSelected5, EmptyObject)
concat_obj (EmptyObject, ObjectSelected6, EmptyObject)
concat_obj (EmptyObject, ObjectSelected7, EmptyObject)
concat_obj (EmptyObject, ObjectSelected8, EmptyObject)
concat_obj (EmptyObject, ObjectSelected9, EmptyObject)
?
?10、創建訓練文件并讀取
TrainFile:='./Charactor.trf'
Words:=['蘇','E','C','6','2','N','8']
write_ocr_trainf (EmptyObject, GrayImage1, Words, TrainFile)
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
11、訓練omc開始識別
read_ocr_class_mlp ('./Charactor.omc', OCRHandle1)
do_ocr_multi_class_mlp (EmptyObject, GrayImage1, OCRHandle1, Class, Confidence)
dev_clear_window ()
dev_set_color ('red')
set_display_font (WindowHandle,30, 'mono', 'true', 'false')
for Index:=0 to |Class|-1 by 1set_tposition (WindowHandle, 30, 120+40*Index)write_string (WindowHandle, Class[Index])
endfor
全部代碼?
dev_update_off ()
dev_close_window ()
*讀取圖片
read_image (Image, 'F:/Halcon/?Image/車牌.jpg')
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
dev_display (Image)
* 處理圖片 - 定位車牌
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 76, 100)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 8600, 10000)
* 處理圖像-轉正
shape_trans (SelectedRegions, RegionTrans, 'rectangle2')
* 找到中心點
area_center (RegionTrans, Area, Row, Column)
*找弧度
orientation_region (RegionTrans, Phi)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(0), HomMat2D)
hom_mat2d_slant (HomMat2D, rad(15), 'x', Column, Row, HomMat2DSlant)
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2DSlant, 'nearest_neighbor')
affine_trans_image (Image, ImageAffineTrans, HomMat2DSlant, 'constant', 'false')
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)
* 開始識別 圖片處理 蘇字拼接
rgb1_to_gray (ImageReduced, GrayImage1)
threshold (GrayImage1, Regions1, 172, 255)
opening_circle (Regions1, RegionOpening, 1.5)
closing_circle (Regions, RegionClosing, 1.7)
connection (RegionOpening, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 19.97, 600)
sort_region (SelectedRegions1, SortedRegions, 'character', 'true', 'column')
* 組裝蘇字區域
select_obj (SortedRegions, ObjectSelected1, 1)
select_obj (SortedRegions, ObjectSelected2, 2)
select_obj (SortedRegions, ObjectSelected3, 3)
union2 (ObjectSelected1, ObjectSelected2, RegionUnion)
union2 (RegionUnion, ObjectSelected3, RegionUnion1)
select_obj (SortedRegions, ObjectSelected4, 4)
select_obj (SortedRegions, ObjectSelected5, 5)
select_obj (SortedRegions, ObjectSelected6, 6)
select_obj (SortedRegions, ObjectSelected7, 7)
select_obj (SortedRegions, ObjectSelected8, 8)
select_obj (SortedRegions, ObjectSelected9, 9)
**把所有區域保存一個對象
gen_empty_obj (EmptyObject)
concat_obj (EmptyObject, RegionUnion1, EmptyObject)
concat_obj (EmptyObject, ObjectSelected4, EmptyObject)
concat_obj (EmptyObject, ObjectSelected5, EmptyObject)
concat_obj (EmptyObject, ObjectSelected6, EmptyObject)
concat_obj (EmptyObject, ObjectSelected7, EmptyObject)
concat_obj (EmptyObject, ObjectSelected8, EmptyObject)
concat_obj (EmptyObject, ObjectSelected9, EmptyObject)
****創建訓練文件
TrainFile:='./Charactor.trf'
Words:=['蘇','E','C','6','2','N','8']
* 完成圖像與字符訓練對應關系
write_ocr_trainf (EmptyObject, GrayImage1, Words, TrainFile)
* 讀取訓練文件
read_ocr_trainf_names (TrainFile, CharacterNames, CharacterCount)
* 創建一個分類識別器
create_ocr_class_mlp (8, 10, 'constant', 'default', CharacterNames, 80, 'none', 10, 42, OCRHandle)
* 訓練分類識別器
trainf_ocr_class_mlp (OCRHandle, TrainFile, 200, 1, 0.01, Error, ErrorLog)
* 保存分類文件
*write_ocr_class_mlp (OCRHandle, './Charactor.omc')
**訓練omc開始識別帶中文車牌
read_ocr_class_mlp ('./Charactor.omc', OCRHandle1)
do_ocr_multi_class_mlp (EmptyObject, GrayImage1, OCRHandle1, Class, Confidence)
dev_clear_window ()
dev_set_color ('red')
set_display_font (WindowHandle,30, 'mono', 'true', 'false')
for Index:=0 to |Class|-1 by 1set_tposition (WindowHandle, 30, 120+40*Index)write_string (WindowHandle, Class[Index])
endfor