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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章