Halcon OCR字符识别(极坐标转换,字符识别)

HalconOCR字符识别实战

Halcon OCR字符识别(极坐标转换,字符识别)

请添加图片描述

代码

* 1.加载图片 ***************************************************
dev_close_window ()
read_image (Image, './img')
get_image_size (Image, Width, Height)
dev_get_window (WindowHandle)
dev_set_colored (12)
dev_set_draw ('margin')
dev_display (Image)

* 2.获取字符区域 ***************************************************
rgb1_to_gray (Image, GrayImage)
get_image_size (GrayImage, Width, Height)
threshold (GrayImage, Region, 40, 140)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 13000, 99999)
fill_up (SelectedRegions, RegionFillUp)
opening_circle (RegionFillUp, RegionOpening, 5.5)

* 3.字符环形区域 ***************************************************
gen_contour_region_xld (RegionOpening, Contours, 'border')
segment_contours_xld (Contours, ContoursSplit, 'lines_circles', 5, 4, 2)
length_xld (ContoursSplit, Lengths)
LengthIndex := sort_index(Lengths)[|Lengths| - 1]
select_obj(ContoursSplit, ObjectSelected, LengthIndex + 1)

fit_circle_contour_xld (ObjectSelected, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle (Circle, Row, Column, Radius)

dilation_circle (Circle, RegionDilation, 5.0)
erosion_circle (Circle, RegionErosion, 30)

difference (RegionDilation, RegionErosion, RegionDifference)
reduce_domain (GrayImage, RegionDifference, ImageReduced)
stop()

* 4.极坐标转换与旋转 ***************************************************
polar_trans_image_ext (ImageReduced, PolarTransImage, Row, Column, \
                       rad(85), rad(280), Radius-100, Radius, \
                       750, 250, 'nearest_neighbor')
rotate_image (PolarTransImage, ImageRotate, 90, 'constant')


* 5.获取文本区域 ***************************************************
threshold (ImageRotate, RegionText, 160, 255)
threshold (ImageRotate, RegionBack, 35, 80)
fill_up (RegionBack, RegionBack)
connection (RegionBack, ConnectedRegions1)
select_shape_std (ConnectedRegions1, SelectedBack, 'max_area', 70)

intersection (RegionText, SelectedBack, RegionIntersection)
connection (RegionIntersection, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedTexts, 'area', 'and', 10, 99999)

* 6. 获取文本外接矩形***************************************************
opening_circle (SelectedTexts, SelectedTexts, 1.5)
union1 (SelectedTexts, RegionUnion)

closing_rectangle1 (RegionUnion, RegionClosing, 80, 3)
fill_up (RegionClosing, RegionFillUp1)
connection (RegionFillUp1, ConnectedRegions3)
shape_trans (ConnectedRegions3, RegionTrans, 'rectangle1')
dilation_rectangle1 (RegionTrans, RegionDilation1, 15, 5)
sort_region (RegionDilation1, SortedRegions, 'first_point', 'true', 'row')

invert_image (ImageRotate, ImageInvert)

* 7.循环识别字符 ***************************************************
* 读取OCR
read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)

* 存放结果字典
create_dict (DictHandle)

count_obj (SortedRegions, Number)
for Index := 1 to Number by 1
    * 获取区域内文本
    select_obj (SortedRegions, SubRect, Index)
    intersection (SubRect, SelectedTexts, SubRegion)
    
    connection (SubRegion, ConnectedRegions4)
    sort_region (ConnectedRegions4, SortedRegions1, 'first_point', 'true', 'column')
    * 字符识别
    do_ocr_multi_class_mlp (SortedRegions1, ImageInvert, OCRHandle, Class, Confidence)
    
    area_center (SubRect, Area, RowRect, ColumnRect)
    tuple_mean (Confidence, MeanConfidence)
    * 拼接结果
    Concat := ''
    if(|Class| == 1)
        Concat := Class
    else
        for Index1 := 1 to |Class|by 1
            Concat := Concat + Class[Index1-1] 
        endfor
    endif
    * 结果写入字典
    set_dict_tuple (DictHandle, Index, [RowRect, ColumnRect, Concat, MeanConfidence])
    
endfor


* 8.显示结果 ***************************************************
dev_clear_window ()
dev_display (ImageRotate)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 循环解析字典
get_dict_param (DictHandle, 'keys', [], AllKeys)
for Index := 0 to |AllKeys| - 1 by 1
    
  NextKey := AllKeys[Index]
  * 获取数据
  get_dict_param (DictHandle, 'key_data_type', NextKey, NextKeyDataType)
  get_dict_tuple (DictHandle, NextKey, ResultTuple)
  
  * 显示区域
  RowText := ResultTuple[0] - 15
  CloumnText := ResultTuple[1] + 20
  * 显示结果
  result_msg := ResultTuple[2] + ' ' +   ResultTuple[3] $ '.3f'
  disp_message (WindowHandle, result_msg, 'image', RowText, CloumnText, 'blue', 'true')

endfor

结果显示

请添加图片描述

<think>嗯,用户想知道如何用Halcon的深度学习OCR功能获取每个字符的坐标。首先,我需要回忆一下HalconOCR流程。根据引用中的资料,HalconOCR分为检测和识别两个阶段。检测阶段会找到文本行的位置,识别阶段则是识别具体字符。但用户需要的是每个字符的坐标,而不仅仅是文本行的位置。 我记得在传统OCR方法中,可能需要分割字符然后逐一处理,但深度学习方法通常是端到端的。不过Halcon的深度学习OCR可能还是分成检测和识别两步。用户提到的引用3提到,HALCONOCR分成检测和识别,检测出文本行的位置,然后识别该行的字符。所以问题在于,如何从这两个步骤中得到每个字符的坐标。 首先,检测阶段使用模型如DLSample中的detection结果,可能得到文本框的区域,比如矩形或四边形。然后识别阶段,可能得到字符的序列,但如何关联到坐标呢?或许在识别阶段,模型不仅能输出字符,还能输出每个字符的位置信息。不过需要查阅Halcon的相关函数文档。 在引用2中,提到了Halcon的传统OCR方法,使用分类器和句柄,但深度学习的OCR可能不同。引用3提到导出到C++调用,可能涉及模型的应用。用户需要的是每个字符的坐标,可能需要结合检测后的区域和字符的位置偏移。 可能的步骤是:首先检测文本行区域,然后在该区域内进行字符分割或识别,同时记录每个字符的位置。或者,在识别模型输出时,是否包含每个字符的边界框?例如,某些OCR模型如CRNN可能输出序列,但不带位置,而像Faster R-CNN这样的检测模型可能每个字符都有框。不过Halcon的深度学习OCR可能采用的是检测整个文本行,再识别字符序列,这时候每个字符的位置可能需要基于文本行的位置和顺序来推断。 假设文本行是水平或经过极坐标转换后的直线,那么每个字符的位置可能按顺序排列在文本行区域内。例如,文本行的区域是一个矩形,那么字符的位置可以按顺序从左到右计算每个字符的边界框,基于字符的宽度和间隔。 具体到Halcon的函数,可能需要在识别后使用某些函数来获取字符的位置。例如,在传统方法中,分割字符然后获取每个字符的区域,但在深度学习方法中,可能需要模型直接输出每个字符的位置。或者,使用深度学习检测模型,每个字符作为检测对象,这样可以直接得到坐标。 需要确认Halcon的深度学习OCR是否支持字符级别的检测。如果支持,那么在检测阶段就能得到每个字符的坐标。否则,可能需要先检测文本行,再在文本行内部进行字符分割或识别,结合文本行的位置计算每个字符的相对位置。 查阅Halcon文档,发现Halcon的深度学习OCR可能使用基于检测的方法,如DETECT方法,其中可以检测到字符级别的区域。或者,使用基于分割的方法,生成每个字符的掩膜,进而计算坐标。 假设用户使用的是基于检测的模型,那么在推理过程中,模型会输出每个字符的边界框坐标。这时候,用户需要配置模型为字符级别的检测,然后通过相应的接口获取坐标信息。 另外,Halcon的流程可能包括预处理、模型推理和后处理。在后处理中,可能需要解析模型输出的区域信息,提取每个字符的坐标。例如,使用get_dict_tuple获取每个检测结果中的区域或坐标数据。 总结步骤可能是:1. 加载训练好的字符检测模型;2. 对图像进行预处理;3. 运行模型检测,获取每个字符的区域或坐标;4. 遍历检测结果,提取每个字符的位置信息,如行、列坐标和宽高。 需要确保模型在训练时标注了每个字符的位置,这样模型才能输出相应的坐标。同时,在HalconOCR接口中是否有相应的参数或函数来返回这些信息,比如设置输出格式为包含坐标的字典项。 可能的关键函数包括apply_dl_model进行模型推理,然后使用get_dict_tuple或类似函数从结果字典中提取每个字符的坐标。此外,可能需要处理区域转换,将相对坐标转换为绝对坐标。 最后,测试代码示例可能需要展示如何加载模型,运行检测,提取坐标,并输出结果。同时,需要注意图像的预处理步骤,确保输入符合模型要求,以及后处理中对坐标的正确解析。</think>### 使用Halcon深度学习OCR获取字符坐标的方法 Halcon的深度学习OCR功能可通过以下步骤获取每个字符的坐标: --- #### **1. 模型训练与数据准备** - **文本检测模型**:需训练一个能够输出文本行位置及字符级别坐标的模型。需在标注数据中包含每个字符的边界框(Bounding Box)信息。 - **数据格式**:使用`read_dl_dataset_ocr`加载标注数据,确保包含字符位置标签(如$[x_{\text{min}}, y_{\text{min}}, x_{\text{max}}, y_{\text{max}}]$)。 --- #### **2. 检测与识别流程** ##### **步骤1:加载预训练OCR模型** ```python read_dl_model ('ocr_model.hdl', DLModelHandle) ``` ##### **步骤2:预处理图像** ```python preprocess_dl_dataset (Image, ProcessedImage, DLPreprocessParam) ``` ##### **步骤3:执行OCR推理** ```python apply_dl_model (DLModelHandle, ProcessedImage, 'all', OutputDict) ``` ##### **步骤4:解析字符坐标** - 从`OutputDict`中提取字符坐标: ```python get_dict_tuple (OutputDict, 'char_boxes', CharBoxes) # 获取所有字符的边界框坐标 get_dict_tuple (OutputDict, 'char_labels', CharLabels) # 获取对应字符类别 ``` --- #### **3. 关键参数与后处理** - **字符级检测**:需在模型训练时启用`detect_individual_characters`参数,确保输出字符级坐标。 - **坐标转换**:若图像经过缩放或裁剪,需通过仿射变换将坐标映射回原图: $$ x_{\text{original}} = x_{\text{detected}} \times \text{scale} + \Delta x $$ 其中$\text{scale}$为缩放比例,$\Delta x$为偏移量[^3]。 --- #### **4. 代码示例** ```python * 初始化模型和图像 read_image (Image, 'test.png') read_dl_model ('ocr_model.hdl', DLModelHandle) * 预处理与推理 preprocess_dl_model (Image, ProcessedImage) apply_dl_model (DLModelHandle, ProcessedImage, DLResult) * 提取字符坐标和类别 get_dict_tuple (DLResult, 'char_boxes', CharBoxes) get_dict_tuple (DLResult, 'char_labels', CharLabels) * 遍历输出结果 for i := 0 to |CharBoxes| - 1 by 1 * 获取第i个字符的坐标(格式为[x1, y1, x2, y2]) Box := CharBoxes[i] * 获取对应字符类别 Label := CharLabels[i] * 在原图中绘制边界框 gen_rectangle1 (Rectangle, Box[0], Box[1], Box[2], Box[3]) dev_display (Rectangle) endfor ``` --- #### **注意事项** 1. **模型类型选择**:使用基于检测的OCR模型(如YOLO或Faster R-CNN架构),而非纯识别模型[^3]。 2. **标注一致性**:训练数据中字符坐标需与图像分辨率对齐,避免坐标偏移。 3. **性能优化**:若需实时处理,可通过`set_dl_model_param`启用GPU加速。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

廷益--飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值