Halcon光學字符訓練與識別

待識別原圖
在這裏插入圖片描述
識別過程:
閾值處理後:
在這裏插入圖片描述
開始分割處理
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
着色字符:
在這裏插入圖片描述
排序後:
在這裏插入圖片描述
識別結果:
在這裏插入圖片描述

Halcon HDevelop代碼:

dev_update_off ()
dev_close_window ()
* read_image (Image, 'ocr/wafer_semi_font_01')
dev_open_window (0, 0, -1, -1, 'black', WindowHandle)
* dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

 read_image (Image, 'd:/Desktop/vision/ZN_TXT01.png')
*read_image (Image, 'd:/Desktop/vision/chuanchuan.png')
get_image_size (Image, Width, Height)

*dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
* dev_set_draw ('margin')
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_line_width (2)
* dev_set_color ('green')
*dev_set_colored (12)

*以顏色填充方式顯示字符,實心
dev_set_draw ('fill')

    * Characters must be black-on-white, i.e., dark characters on a light background
    *反轉圖片,使前景爲白色,便於處理
    invert_image (Image, ImageInvert)
    
*     mean_image (Image, ImageMean, 31, 31)
*     dyn_threshold (Image, ImageMean, RegionDynThresh, 0.1, 'light')
    *使用閾值分割,提取前景
    threshold (ImageInvert, Region, 155, 255)
 
*   fill_up_shape (Region, RegionFillUp, 'area', 100, 10)
      
    *膨脹,筆畫加粗
*     dilation_circle (Region, Reg_dil, 1.5)  
    
    *字符筆畫泛暈,加粗筆畫,橫向和豎直方向擴展面積
    *將單個字符暈染連成一塊
    closing_rectangle1 (Region, RegionClosing1, 12, 27)
  *  opening_rectangle1 (RegionClosing1, RegionOpening1,1, 3)
*   fill_up_shape (RegionClosing1, RegionFillUp, 'area', 100, 10)
    
     *畫個方塊,rad裡面是旋轉角度
     gen_rectangle2 (Rectangle, 10, 10, rad(110), 3, 7.3)
     *將上面的方塊用於區域的連接
  closing (RegionClosing1, Rectangle, RegionClosing2)

     *填充算子,將整個字符區域填充  
*    fill_up(RegionClosing1,RegionFillUp)    
*     closing_rectangle1 (RegionClosing1, RegionClosing2, 20, 20)
    
    *以9度閉合畫圓圈
    closing_circle (RegionClosing2, IntermedCharacters, 9) 
     
    connection (IntermedCharacters, ConnPatterns)
     
    *選中區域變形為方形
shape_trans (ConnPatterns, CharBlocks, 'rectangle1')
*這個算子 是根據文字單體大小 用矩形將文字區分開來(爲後面求交集做準備)
partition_rectangle (CharBlocks, CharCandidates, 60,150)

   *求交集 顏色模塊在前,原字符再後,才能單獨著色交集後的單體字符
    intersection (CharCandidates, Region, RegionIntersection)  
dev_clear_window()
 *dev_clear_obj(CharCandidates)
dev_display(RegionIntersection)
 *排序
sort_region (RegionIntersection, FinalCharacters, 'character', 'true', 'row')
dev_display(FinalCharacters)

    *-----此行上面識別圖片中字符到單字符着色正確-----
    *開始訓練****************
    *計算字符個數
    count_obj (FinalCharacters, Number)

    *創建訓練文件******
    *標籤
    words:=['四','川','省','成','都','市','錦','州','路','達','府','院']
    
    TrainFile:='D:/testWords.trf'
	FontFile:='D:/testWords.omc'
    dev_set_check('~give_error') 
    *delete_file(TrainFile) 
    *dev_set_check('~give_error')

    *生成訓練文件
    for i:=1 to Number by 1 
        select_obj(FinalCharacters, SingleWord, i) 
		currentChar:=words[i-1]
        append_ocr_trainf(SingleWord,Image,currentChar,TrainFile) 
    endfor

    *讀取訓練文件
    read_ocr_trainf_names(TrainFile, CharacterNames, CharacterCount)

    *這裏採用halcon預訓練模型;第二次及以後訓練先將文件名改爲FontFile,調用已訓練的參數繼續訓練
    *read_ocr_class_mlp('HandWritten_0-9.omc', OCRHandle)

    *自己創建神經網絡分類器
    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, FontFile) 
    *釋放內存
    *clear_ocr_class_mlp(OCRHandle)
	
	
	**------------下面是識別代碼---------------------------------------
	 *開始識別
	read_ocr_class_mlp (FontFile, OCRHandle)
	do_ocr_multi_class_mlp (FinalCharacters, Image, OCRHandle, Class, Confidence)
	*顯示識別的字符到最小的單字符個體矩形左下角
	smallest_rectangle1 (FinalCharacters, Row11, Column1, Row2, Column21)
	disp_message (WindowHandle, Class, 'image', Row2, Column1+10, 'green', 'false')
	*釋放內存
    clear_ocr_class_mlp(OCRHandle)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章