OCR识别中级篇,Halcon实战项目讲解一,点状字符。
Halcon程序及其講解。
為本人學習筆記
單步具體講解:
read_image (Image, ‘D:/shijue/學習筆記/OCR識別1.png’)
//直接調用image助手,直接訪問我們的圖片。
get_image_size (Image, Width, Height)
//選取我們的圖片的寬高方便后續提取圖片的中心點
gen_rectangle1 (ROI_0, 18.0852, 220.975, 649.983, 1158.32)
//繪制我們所需要的空間,方便后續直接提取。繪制范圍可以根據多張圖片繪制大小都可以。
//繪制ROI工具助手
text_line_slant (Image, Image, 70, -0.4, 0.4, SlantAngle)
//對圖像中的字符進行識別,并將識別到的字符相對于窗口的的角度存放在SlantAngle,函數中//的70,-0.4,0.4均不影響后續的處理,但是第四與第五個變量必須為相反關系。具體可直接查
//詢halcon算子詳細
vector_angle_to_rigid (Height/2, Width/2, SlantAngle,Height/2, Width/2, 0, HomMat2D)
//對圖像進行一定角度的翻轉。Height/2, Width/2,選取高與寬的二份之一位旋轉的中心點。然后旋轉角度為SlantAngle。第四與第五的變量均為第一與第二個變量相一致。第六的變量置為0。HomMat2D為旋轉后的圖像存放變量,但是不能直接調用顯示函數直接顯示
affine_trans_image (Image, ImageAffineTrans, HomMat2D, ‘constant’, ‘false’)
//對旋轉的圖像進行仿射變換。實際的效果為顯示旋轉后的圖像。
//上述就3條函數就可以實現對圖像的矯正變化。為通用模板。
//
dots_image (ImageAffineTrans, DotImage, 5, ‘dark’, 0)
//由于halcon中包含對點狀的圖像進行直接讀取的功能。所以掉用點狀讀取算子。DotImage為輸出的圖像變量存放位置。5為點狀的最大直徑。如果不想選取過大的點,可以調小,可以使用默認直徑?!甦ark’,最重要的變量。你提取的點狀區域是提取暗色還是亮色(light)還是所有(all)。
reduce_domain (DotImage, ROI_0, ImageReduced)
//裁剪圖像。DotImage被裁剪圖像,ROI_0裁剪剩余區域。ImageReduced裁剪后的圖像存放變量。
invert_image (ImageReduced, ImageInvert)
//對圖像進行亮暗翻轉。對于halcon的程序來說。Halcon默認識別字符是暗色字符,亮色背景。
binary_threshold (ImageReduced, Region, ‘max_separability’, ‘light’, UsedThreshold)
//快速二值化函數。當圖像中只包含2種或者灰度值差別特別大時,可以直接使用快速二值化函數。ImageReduced輸入圖像。Region輸出圖像。'max_separability’處理方式(最大方差),'light’提取亮色部分,暗色為(dark)。UsedThreshold默認二值化參數。
dilation_rectangle1 (Region, RegionDilation, 12,12)
//進行膨脹處理,將字符連接在一起。在入門篇中為必須處理步驟,如果不進行膨脹則會使得例如1,i等字符會被識別成2個區域。還有就是膨脹數值太小也會導致字符不能連接在一起,肉眼可能不能觀察到,但是進行connection就會有問題。這時候直接調大膨脹量就行了。
connection (RegionDilation, ConnectedRegions)
//拆分區域。RegionDilation輸入圖像。ConnectedRegions輸出圖像。
shape_trans (ConnectedRegions, RegionTrans,‘rectangle1’)
//將區域進行選擇,‘rectangle1’選擇部分為矩形區域
select_shape (RegionTrans, SelectedRegions, [‘height’,‘width’], ‘and’, [36.394,15.48], [100,161.44])
//對多余的區域進行去除。由于我們的字符是具有一定的寬高的區域。我們在進行特征選擇的時候可以直接采用對一定高的區域,對一定寬的區域進行篩選。如果不行可以在膨脹后進行開運算或者繼續調大膨脹量。
partition_rectangle (SelectedRegions, Partitioned, 50, 100)
//OCR核心識別函數。對于我們已經選擇好的區域我們發現一個區域中包含多個字符。那么我們直接繼續切割區域??梢渣c擊鍵盤的ctal鍵和移動鼠標可以大致看到字符的寬高。然后輸入變量固定值。50,為切割寬度。100為切割高度。Partitioned輸出圖像的變量。
intersection (Partitioned, Region, RegionIntersection)
//然后進行取交集。這一步最容易出現錯誤。我們要與什么取交集。我們需要的是與我們快速二值化的函數輸出進行取交集。我們Partitioned這個變量是我們處理到的字符所在的區域,Region這個變量是我們提取到的字符的形態的。當2個去交集的時候才可以實現。
sort_region (RegionIntersection, SortedRegions, ‘character’, ‘true’, ‘row’)
//對區域輸出進行優先排序。主要需要注意排序方式。由于halcon的默認排序方式為從上到逐一排序,所以我們需要修改變量。排序方式為算子的第三個變量’character’。'character’已經我修改好為從左到右排序。更多排序方式可以查看halcon的算子助手。
read_ocr_class_mlp (‘D:/shijue/halcon1/ocr/DotPrint_0-9A-Z_NoRej.omc’, OCRHandle)
//讀取halcon的字符識別分類器。Halcon對字符的分類器有非常多種。這次我們的是點狀字符。所以選擇的是DotPrint【點印】開頭的文件,且我們包含有0-9和大寫字母等多種字符,所以調用為0-9A-Z類型。對于我們正常輸出應調用NoRej類型而不是調用Rej類型,OCRHandle為OCR句柄。Halcon分類器的路徑在我們自己的安裝程序目錄halcon/ocr中
do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)
//使用分類器進行區分輸出。SortedRegions我們取完交集后的輸出圖像。ImageInvert我們識別的區域,因為我前面說過halcon只支持暗色字體,亮色背景,所以如果我們的字體為亮色應該將字體進行亮暗翻轉,亮暗翻轉的算子為invert_image。OCRHandle,OCR句柄,就是我們上面讀取分類器的時候進行的輸出OCR句柄,Class輸出數組,halcon會把所有識別到的數組存放在這個變量中,如果你沒有進行排序或者排序錯誤則輸出的數組循序也會是錯誤的。Confidence調用類型。這個算子是對所有字體進行同步一起識別。也有逐一識別。當我們所要的字符在一定區域,我們可以通過排序然后循環一定個數輸出我們需要的字符。
dev_display (ImageAffineTrans)
//顯示修正角度后圖像。
smallest_rectangle1 (SortedRegions, Row1, Column1, Row2, Column2)
//對圖像繼續求取最小矩形,方便后面存放輸出到圖像上
dev_get_window (WindowHandle)
//獲取窗口句柄,用于輸出在窗口中。
disp_message (WindowHandle, Class, ‘window’, Row1, Column1-80, ‘black’, ‘true’)
//輸出字符在窗口中
輸出效果
總結實戰:
第一:讀圖。
第二:無論任何情況都需要修正字符角度,除非已經保證字符是平行與圖像的。
固定的套路程序,可以直接調用萬能。
get_image_size (Image, Width, Height)
gen_rectangle1 (ROI_0, 18.0852, 220.975, 649.983, 1158.32)
//可以不用畫ROI區域,其他代碼可以直接使用
text_line_slant (Image, Image, 70, -0.4, 0.4, SlantAngle)
vector_angle_to_rigid (Height/2, Width/2, SlantAngle,Height/2, Width/2, 0, HomMat2D)
affine_trans_image (Image, ImageAffineTrans, HomMat2D, ‘constant’, ‘false’)
第三:對字符提取,對于點狀字符而言我們可以直接使用
dots_image (ImageAffineTrans, DotImage, 5, ‘dark’, 0)
點狀字符提取函數。如果不是點狀字符則可以用通過思路解決,在入門篇halcon案例中均是非點狀字符的。
第四:使得圖像為一個連通域,防止i,1等字符無法識別成功
固定程序:
dilation_rectangle1 (Region, RegionDilation, 12,12)
connection (RegionDilation, ConnectedRegions)
如果字符為亮字符則需要進行亮暗轉化,算子為:invert_image (ImageReduced, ImageInvert)
當圖像只有黑白2種顏色或者,灰度值差別特別大時,可以直接調用快速二值化函數進行輸出。相關算子:binary_threshold (ImageReduced, Region, ‘max_separability’, ‘light’, UsedThreshold)
第五:進行區域拆分
固定程序:
shape_trans (ConnectedRegions, RegionTrans,‘rectangle1’)
select_shape (RegionTrans, SelectedRegions, [‘height’,‘width’], ‘and’, [36.394,15.48], [100,161.44])
partition_rectangle (SelectedRegions, Partitioned, 50, 100)
intersection (Partitioned, Region, RegionIntersection)
sort_region (RegionIntersection, SortedRegions, ‘character’, ‘true’, ‘row’)
進行區域選擇然后去除多余部分,對字符區域切割,與二值化的圖像取交集,進行排序
第六:進行讀取halcon分類器輸出
固定程序:
read_ocr_class_mlp (‘D:/shijue/halcon1/ocr/DotPrint_0-9A-Z_NoRej.omc’, OCRHandle)
do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)
dev_display (ImageAffineTrans)
smallest_rectangle1 (SortedRegions, Row1, Column1, Row2, Column2)
count_obj (SortedRegions, Number1)
dev_get_window (WindowHandle)
disp_message (WindowHandle, Class, ‘window’, Row1, Column1-80, ‘black’, ‘true’)
當然調用的分類器可能不會相同,但是思路都是一樣的。
//
最后如果我們要對漢字進行識別了,這個需要我們自己訓練分類器,需要的訓練量會非常大,通常不需要。
/*********************************************/
有問題可以直接叫我。
總結
以上是生活随笔為你收集整理的OCR识别中级篇,Halcon实战项目讲解一,点状字符。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序使用iconfont在线ico
- 下一篇: esp8266 爆改车间主任版本 使用