halcon粘连字符分割_halcon12 字符分割(新)

本文介绍了使用Halcon进行字符分割的两种方法,针对粘连字符的问题进行了处理。通过char_threshold算法和闭运算去噪来分割图像,并提供了详细的代码示例。同时,展示了如何进行图像匹配和OCR识别,对处理暗图像和带有背景波纹的图像进行了探讨。
摘要由CSDN通过智能技术生成

*2017090910254402.bmp

*2017090909081102.bmp

*read_image(Image,"H:/opencvlab/cameraProgram/CAMERA_NO_NULTI_REGION/OCR/MyCamera_daheng_bottle_ocr_1280_多线程_宛西_不改界面/MyCamera2008/images/2017090909081102.bmp")

*gen_rectangle1(Rectangle, 297, 628, 573, 1067)

*2017090719402601.bmp

*H:/opencvlab/cameraProgram/CAMERA_NO_NULTI_REGION/OCR/MyCamera_daheng_bottle_ocr_1280_多线程_宛西_不改界面/MyCamera2008/images/image2

*------------------------------- 分割图像 暗图像不带波纹 ------------------------------------//

read_image(Image,"H:/现场测试数据/ocr20170522恰恰第二次调试现场数据/ocr20170522恰恰第二次调试现场数据/images/2017052017243302.bmp")

* gen_rectangle1(Rectangle, 308, 687, 600, 922)

* reduce_domain(Image,Rectangle,ImageReduced)

* crop_domain(ImageReduced, ImageReduced)

*rgb1_to_gray(ImageReduced, GrayImage)

* gen_disc_se(SE, "byte", 21, 21, 0)

* gray_bothat(ImageReduced,SE, ImageBotHat)

* min_max_gray(ImageBotHat,ImageBotHat, 0, Min2, Max2, Range2)

* scale_image(ImageBotHat, ImageScaled1, 256/Max2, 0)

* threshold(ImageScaled1, Region2, 90, 255)

* opening_circle (Region2, RegionOpening, 1.5)

* region_to_bin(RegionOpening, BinImage, 255, 0, 512, 512)

stop()

*------------ char_threshold算法适用于恰恰背景

*------------字符分割算法 char_threshold

* char_threshold (ImageReduced, ImageReduced, Characters, 0, 95, Threshold)

*------------闭运算去噪声-----------------------

* opening_circle (Characters, RegionOpening, 1.2)

*-------------区域转图像--------------------------

* region_to_bin(RegionOpening, BinImage1, 255, 0, 512, 512)

* write_image(BinImage1, "bmp", 0, "c:/segment_result.bmp")

stop()

*------------------------------ 分割图像1结束 ----------------------------------//

*------------------------------- 分割图像2 采用char_threshold ------------------//

* dev_close_window()

*注意c:/ocr4.bmp这种图像不适用于char_threshold的算法

*read_image(Image,"C:/Users/Administrator/Desktop/无标题-3.bmp")

* get_image_size(Image, Width, Height)

* dev_open_window(0, 0, Width, Height, "black", WindowHandle)

*------------字符分割算法 char_threshold

* char_threshold (Image, Image, Characters, 0, 87, Threshold)

*------------闭运算去噪声-----------------------

* opening_circle (Characters, RegionOpening, 1)

*-------------区域转图像--------------------------

* region_to_bin(RegionOpening, BinImage1, 255, 0, Width, Height)

* write_image(BinImage1, "bmp", 0, "c:/segment_result.bmp")

stop()

*------------------------------ 分割图像2结束 ---------------------------------//

*------------------------------ 先做图像匹配 ----------------------------------

* Matching 03: Obtain the model image

*read_image (Image, "D:/opencv_images/wanxi_images/2017090909081102.bmp")

* Matching 03: build the ROI from basic regions

temp_top:=295

temp_left:=542

temp_bottom:=383

temp_right:=636

temp_width:=temp_right-temp_left

temp_height:=temp_bottom-temp_top

temp_center_row:=(temp_top+temp_bottom)/2

temp_center_col:=(temp_left+temp_right)/2

gen_rectangle1 (ModelRegion, temp_top, temp_left, temp_bottom, temp_right)

*生成检测区域矩形

chk1_top:=403

chk1_left:=687

chk1_bottom:=500

chk1_right:=937

chk1_width:=chk1_right-chk1_left

chk1_height:=chk1_bottom-chk1_top

chk1_center_row:=(chk1_top+chk1_bottom)/2

chk1_center_col:=(chk1_left+chk1_right)/2

gen_rectangle1(CheckReion1, chk1_top, chk1_left, chk1_bottom, chk1_right)

stop()

*------------------------------ 下面是ocr识别代码 --------------------------

* OCR 04: Code generated by OCR 04

* OCR 04:

* OCR 04: Prepare text model

* OCR 04:

* create_text_model_reader ("manual", [], TextModel)

* set_text_model_param (TextModel, "polarity", "light_on_dark")

* set_text_model_param (TextModel, "is_dotprint", "true")

* set_text_model_param (TextModel, "char_width", 29)

* set_text_model_param (TextModel, "char_height", 50)

* set_text_model_param (TextModel, "stroke_width", 4.9)

* set_text_model_param (TextModel, "return_punctuation", "false")

* set_text_model_param (TextModel, "return_separators", "false")

* set_text_model_param (TextModel, "uppercase_only", "true")

* set_text_model_param (TextModel, "fragment_size_min", 6)

* set_text_model_param (TextModel, "eliminate_border_blobs", "true")

* set_text_model_param (TextModel, "base_line_tolerance", 0.2)

* set_text_model_param (TextModel, "max_line_num", 3)

* OCR 04:

* OCR 04: Load classifier

* OCR 04:

*read_ocr_class_mlp ("DotPrint_0-9.omc", OcrHandle)

*------------------------------ OCR初始化结束 ------------------------

* Matching 03: reduce the model template

reduce_domain (Image, ModelRegion, TemplateImage)

* Matching 03: create the correlation model

create_ncc_model (TemplateImage, 0, rad(-10), rad(10), rad(1.5), "use_polarity", ModelId)

*stop()

*开始匹配

*遍历文件

list_image_files("H:/现场测试数据/ocr20170522恰恰第二次调试现场数据/ocr20170522恰恰第二次调试现场数据/images","bmp", [], ImageFiles)

for Index := 0 to |ImageFiles|-1 by  1

read_image(Image1, ImageFiles[Index])

dev_display(Image1)

*stop()

find_ncc_model (Image1, ModelId, rad(-10), rad(10), 0.5, 1, 0.5, "true", 0, MatchingRow, MatchingCol, MatchingAngle, MatchingScore)

if (|MatchingRow| < 1)

continue

stop()

endif

Row1:=MatchingRow-temp_height/2

Col1:=MatchingCol-temp_width/2

Row2:=MatchingRow+temp_height/2

Col2:=MatchingCol+temp_width/2

*获得相对位置

drow:=Row1-temp_top

dcol:=Col1-temp_left

gen_rectangle1(Rectangle, Row1, Col1, Row2, Col2)

*overpaint_region(Image1, Rectangle, 255, "margin")

Row1:=chk1_top+drow

Col1:=chk1_left+dcol

Row2:=chk1_bottom+drow

Col2:=chk1_right+dcol

gen_rectangle1(Rectangle, Row1, Col1, Row2, Col2)

*overpaint_region(Image1, Rectangle, 255, "margin")

*stop()

*提取出检测区域图像

reduce_domain(Image1,Rectangle,ImageReduced)

crop_domain(ImageReduced, ImagePart)

*stop()

*二值化1 带背景波纹图像

*read_image(ImageReduced,"C:/Users/Administrator/Desktop/无标题-3.bmp")

get_image_size(ImagePart, Width, Height)

dev_open_window(0, 0, Width, Height, "black", WindowHandle)

*------------字符分割算法 char_threshold

char_threshold (ImagePart, ImagePart, Characters, 0, 90, Threshold)

stop()

*------------闭运算去噪声-----------------------

opening_circle (Characters, RegionOpening, 1)

*stop()

*-------------区域转图像--------------------------

region_to_bin(RegionOpening, TmpObj_MonoReduced_OCR_04_0, 255, 0, Width, Height)

write_image(TmpObj_MonoReduced_OCR_04_0, "bmp", 0, "H:/现场测试数据/ocr20170522恰恰第二次调试现场数据/ocr20170522恰恰第二次调试现场数据/images/image2/Result"+Index+".bmp")

*stop()

*二值化2 极暗不带波纹图像

*      get_image_size(ImagePart, Width, Height)

* gen_disc_se(SE, "byte", 21, 21, 0)

* gray_bothat(ImagePart,SE, ImageBotHat)

* min_max_gray(ImageBotHat,ImageBotHat, 0, Min2, Max2, Range2)

* scale_image(ImageBotHat, ImageScaled1, 256/Max2, 0)

* threshold(ImageScaled1, Region2, 90, 255)

* opening_circle (Region2, RegionOpening, 2)

* region_to_bin(RegionOpening, BinImage, 255, 0, Width, Height)

* write_image(BinImage, "bmp", 0, "D:/opencv_images/wanxi_images/image2/image3/Result"+Index+".bmp")

*stop()

*OCR处理

*reduce_domain (TmpObj_Mono, ROI_OCR_04_0, TmpObj_MonoReduced_OCR_04_0)

* OCR 04:

* OCR 04: Orientation Correction (for consistent border and domain

* OCR 04: handling, this is always applied, even with no rotation)

* OCR 04:

* OCR 04: Base orientation of ROI

* TmpCtrl_Orientation := 0

* OCR 04: Corrected for text line orientation

* TmpCtrl_RangeMin := -0.174533

* TmpCtrl_RangeMax := 0.174533

* text_line_orientation (TmpObj_MonoReduced_OCR_04_0, TmpObj_MonoReduced_OCR_04_0, 50, TmpCtrl_Orientation+TmpCtrl_RangeMin, TmpCtrl_Orientation+TmpCtrl_RangeMax, TmpCtrl_Orientation)

* OCR 04: Build rotation matrix

* hom_mat2d_identity (TmpCtrl_MatrixIdentity)

* hom_mat2d_rotate (TmpCtrl_MatrixIdentity, -TmpCtrl_Orientation, 0, 0, TmpCtrl_MatrixRotation)

* OCR 04: Apply transformation to image and domain

* get_domain (TmpObj_MonoReduced_OCR_04_0, TmpObj_Domain)

* get_system ("clip_region", TmpCtrl_ClipRegion)

* set_system ("clip_region", "false")

* dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 24)

* affine_trans_region (TmpObj_DomainExpanded, TmpObj_DomainTransformedRaw, TmpCtrl_MatrixRotation, "true")

* smallest_rectangle1 (TmpObj_DomainTransformedRaw, TmpCtrl_Row1, TmpCtrl_Col1, TmpCtrl_Row2, TmpCtrl_Col2)

* hom_mat2d_translate (TmpCtrl_MatrixIdentity, -TmpCtrl_Row1, -TmpCtrl_Col1, TmpCtrl_MatrixTranslation)

* hom_mat2d_compose (TmpCtrl_MatrixTranslation, TmpCtrl_MatrixRotation, TmpCtrl_MatrixComposite)

* affine_trans_region (TmpObj_Domain, TmpObj_DomainTransformed, TmpCtrl_MatrixComposite, "true")

* affine_trans_image (TmpObj_MonoReduced_OCR_04_0, TmpObj_ImageTransformed, TmpCtrl_MatrixComposite, "constant", "true")

* dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 24)

* expand_domain_gray (TmpObj_ImageTransformed, TmpObj_ImageTransformedExpanded, 24)

* reduce_domain (TmpObj_ImageTransformed, TmpObj_DomainTransformed, TmpObj_ImageTransformedReduced)

* crop_part (TmpObj_ImageTransformedReduced, TmpObj_MonoReduced_OCR_04_0, 0, 0, TmpCtrl_Col2-TmpCtrl_Col1+1, TmpCtrl_Row2-TmpCtrl_Row1+1)

* set_system ("clip_region", TmpCtrl_ClipRegion)

* OCR 04:

* OCR 04: Slant Correction

* OCR 04:

* text_line_slant (TmpObj_MonoReduced_OCR_04_0, TmpObj_MonoReduced_OCR_04_0, 50, -0.244346, 0.174533, TmpCtrl_Slant)

* OCR 04: Build slant matrix

* hom_mat2d_identity (TmpCtrl_MatrixIdentity)

* hom_mat2d_slant (TmpCtrl_MatrixIdentity, -TmpCtrl_Slant, "x", 0, 0, TmpCtrl_MatrixSlant)

* OCR 04: Apply transformation to image and domain

* get_domain (TmpObj_MonoReduced_OCR_04_0, TmpObj_Domain)

* get_system ("clip_region", TmpCtrl_ClipRegion)

* set_system ("clip_region", "false")

* dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 24)

* affine_trans_region (TmpObj_DomainExpanded, TmpObj_DomainTransformedRaw, TmpCtrl_MatrixSlant, "true")

* smallest_rectangle1 (TmpObj_DomainTransformedRaw, TmpCtrl_Row1, TmpCtrl_Col1, TmpCtrl_Row2, TmpCtrl_Col2)

* hom_mat2d_translate (TmpCtrl_MatrixIdentity, -TmpCtrl_Row1, -TmpCtrl_Col1, TmpCtrl_MatrixTranslation)

* hom_mat2d_compose (TmpCtrl_MatrixTranslation, TmpCtrl_MatrixSlant, TmpCtrl_MatrixComposite)

* affine_trans_region (TmpObj_Domain, TmpObj_DomainTransformed, TmpCtrl_MatrixComposite, "true")

* affine_trans_image (TmpObj_MonoReduced_OCR_04_0, TmpObj_ImageTransformed, TmpCtrl_MatrixComposite, "constant", "true")

* dilation_circle (TmpObj_Domain, TmpObj_DomainExpanded, 24)

* expand_domain_gray (TmpObj_ImageTransformed, TmpObj_ImageTransformedExpanded, 24)

* reduce_domain (TmpObj_ImageTransformed, TmpObj_DomainTransformed, TmpObj_MonoReduced_OCR_04_0)

* set_system ("clip_region", TmpCtrl_ClipRegion)

* find_text (TmpObj_MonoReduced_OCR_04_0, TextModel, TmpCtrl_ResultHandle_OCR_04_0)

* OCR 04:

* OCR 04: Read text (classification step)

* OCR 04: Gray values for reading must be dark on bright

* invert_image (TmpObj_MonoReduced_OCR_04_0, TmpObj_MonoInverted_OCR_04_0)

* TmpCtrl_Expressions := ["^[0-9][0-9][0-9][0-9][0-9][0-9]$","^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$","^[0-9][0-9][0-9][0-9][0-9][0-9]$"]

* get_text_result (TmpCtrl_ResultHandle_OCR_04_0, "num_lines", TmpCtrl_NumLines)

* string_result:=""

* for TmpCtrl_LineIndex := 0 to TmpCtrl_NumLines - 1 by 1

*     get_text_object (Symbols_OCR_04_0, TmpCtrl_ResultHandle_OCR_04_0, ["line", TmpCtrl_LineIndex])

*     dev_display (TmpObj_MonoInverted_OCR_04_0)

*     dev_set_draw ("fill")

*     dev_set_colored (3)

*     dev_display (Symbols_OCR_04_0)

*     do_ocr_word_mlp (Symbols_OCR_04_0, TmpObj_MonoInverted_OCR_04_0, OcrHandle, TmpCtrl_Expressions[TmpCtrl_LineIndex % 3], 3, 2, SymbolNames_OCR_04_0, Confidences_OCR_04_0, Words_OCR_04_0, Scores_OCR_04_0)

* OCR 04: Do something with the results

*     string_result := string_result + Words_OCR_04_0

*     stop()

* endfor

* stop()

* clear_text_result (TmpCtrl_ResultHandle_OCR_04_0)

endfor

* Matching 03: END of generated code for model initialization

* Matching 03: BEGIN of generated code for model application

* Matching 03: the following operations are usually moved into

* Matching 03: that loop where the aquired images are processed

* Matching 03: Find the model

find_ncc_model (Image, ModelId, rad(-10), rad(10), 0.5, 1, 0.5, "true", 0, MatchingRow, MatchingCol, MatchingAngle, MatchingScore)

* Matching 03: display the centers of the matches in the detected positions

for MatchingObjIdx := 0 to |MatchingScore| - 1 by 1

* Matching 03: display the center of the match

gen_cross_contour_xld (TransContours, MatchingRow, MatchingCol, 20, MatchingAngle)

dev_display (TransContours)

endfor

* Matching 03: Clear model when done

clear_ncc_model (ModelId)

* Matching 03: END of generated code for model application

* OCR 04: ***************************************************************

* OCR 04: * The code which follows is to be executed once / image       *

* OCR 04: ***************************************************************

* OCR 04:

* OCR 04: Load image

read_image (Image, "C:/segment_result.bmp")

* OCR 04:

* OCR 04: Perform actual processing (once per ROI)

* OCR 04: Generate regions of interest

gen_rectangle1 (ROI_OCR_04_0, 1.14706, 2.95904, 243.265, 372.5)

* OCR 04:

* OCR 04: Extract symbol regions (segmentation step)

* OCR 04: Only consider first channel for color images

access_channel (Image, TmpObj_Mono, 1)

reduce_domain (TmpObj_Mono, ROI_OCR_04_0, TmpObj_MonoReduced_OCR_04_0)

* OCR 04:

* OCR 04: Cleanup (global)

clear_text_model (TextModel)

clear_ocr_class_mlp (OcrHandle)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值