如何使用 HALCON 实现字符提取与识别:一步步教程

一、引言

在机器视觉和图像处理领域,光学字符识别(OCR)是一项非常实用的技术,广泛应用于发票识别、车牌识别、验证码处理等领域。本篇博客将通过一个具体案例,使用 HALCON 软件,详细讲解如何从图像中提取字符并进行识别。我们将一步步分析代码逻辑,并对关键步骤进行优化,帮助读者实现字符提取与识别的功能。


二、案例背景

我们需要从图像 u.bmp 中提取字符并识别其内容。图像中可能包含倾斜的文本,因此我们需要先校正图像,然后提取字符区域,最后进行 OCR 识别。以下是代码的核心步骤和对应解释:


三、代码实现

以下是实现字符提取与识别的完整代码,结合注释解释每一步的逻辑。

1. 读取图像并显示窗口
// 读取图像
read_image (Image, 'C:/Users/15783/Desktop/halcon/7.OCR字符提取/作业练习/u.bmp')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)

说明

  • 使用 read_image 读取图像文件。
  • 使用 get_image_size 获取图像的宽度和高度。
  • 打开一个窗口,便于显示中间结果。
2. 图像预处理
// 计算图像的均值图像
mean_image (Image, ImageMean, 99, 99)

// 动态阈值分割,提取暗色区域
dyn_threshold (Image, ImageMean, RegionDynThresh, 15, 'dark')

// 连接区域
connection (RegionDynThresh, ConnectedRegions)

// 根据面积筛选区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 200, 65743.7)

// 对筛选区域进行膨胀操作
dilation_circle (SelectedRegions, RegionDilation, 2.5)

说明

  • 均值图像:通过 mean_image 计算图像的均值图像,用于动态阈值分割。
  • 动态阈值分割:使用 dyn_threshold 提取图像中的暗色区域,这些区域可能是字符区域。
  • 连接区域:通过 connection 将分割后的区域连通,避免区域被分割成碎片。
  • 筛选区域:使用 select_shape 根据面积筛选区域,去除过小或过大的区域。
  • 膨胀操作:使用 dilation_circle 对筛选后的区域进行膨胀,确保字符区域更加完整。
3. 显示中间结果
// 显示原图像和提取的区域
dev_display (Image)
dev_set_colored (6)
dev_set_draw ('fill')
dev_display (RegionDilation)

说明

  • 原图像显示:显示原图像,便于与处理后的结果对比。
  • 提取区域显示:显示经过膨胀操作后的字符区域,确认区域提取是否准确。
4. 区域排序与 OCR 识别
// 对区域进行排序
sort_region (RegionDilation, SortedRegions, 'character', 'true', 'row')

// 加载 OCR 模型
read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)

// 进行 OCR 识别
do_ocr_multi_class_mlp (SortedRegions, Image, OCRHandle, Class, Confidence)

// 清理 OCR 模型资源
clear_ocr_class_mlp (OCRHandle)

说明

  • 排序区域:使用 sort_region 对提取的字符区域进行排序,确保识别时的顺序正确。这里使用了 'character' 作为排序依据,表示按字符顺序排序。
  • 加载 OCR 模型:加载预先训练好的 OCR 模型 Industrial_0-9A-Z_NoRej.omc,该模型用于识别数字和大写字母。
  • OCR 识别:使用 do_ocr_multi_class_mlp 对排序后的区域进行识别,并获取每个字符的类别和置信度。
  • 清理资源:使用 clear_ocr_class_mlp 清理 OCR 模型的资源,释放内存。
5. 处理识别结果
// 处理识别结果
tuple_regexp_replace (sum(Class), '0', '0', Result)

说明

  • 识别结果拼接:使用 sum(Class) 将 OCR 识别的结果拼接成一个字符串。
  • 处理噪声:如果识别结果中包含噪声(如误识别的字符),可以使用 tuple_regexp_replace 进行清理。
6. 显示最终结果
// 显示最终识别结果
disp_message (WindowHandle, '获得的结果是' + Result, 'window', 12, 12, 'black', 'true')

说明

  • 使用 disp_message 在打开的窗口中显示最终识别结果。

 

四、总结

通过上述步骤,我们可以从图像中提取字符并进行识别。以下是整个流程的总结:

  1. 读取图像并进行预处理(均值图像、动态阈值分割、区域连接和筛选)。
  2. 对提取的字符区域进行排序。
  3. 使用 OCR 模型对排序后的区域进行识别。
  4. 处理识别结果并输出最终结果。

通过合理调整参数和优化步骤,我们可以提高字符提取与识别的准确性和效率。希望这篇博客对您有所帮助!如果有任何问题,欢迎继续交流。


五、完整代码

以下是完整代码供参考:

// 读取图像
read_image (Image, 'C:/Users/15783/Desktop/halcon/7.OCR字符提取/作业练习/u.bmp')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)

// 计算图像的均值图像
mean_image (Image, ImageMean, 99, 99)

// 动态阈值分割,提取暗色区域
dyn_threshold (Image, ImageMean, RegionDynThresh, 15, 'dark')

// 连接区域
connection (RegionDynThresh, ConnectedRegions)

// 根据面积筛选区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 200, 65743.7)

// 对筛选区域进行膨胀操作
dilation_circle (SelectedRegions, RegionDilation, 2.5)

// 显示原图像和提取的区域
dev_display (Image)
dev_set_colored (6)
dev_set_draw ('fill')
dev_display (RegionDilation)

// 对区域进行排序
sort_region (RegionDilation, SortedRegions, 'character', 'true', 'row')

// 加载 OCR 模型
read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)

// 进行 OCR 识别
do_ocr_multi_class_mlp (SortedRegions, Image, OCRHandle, Class, Confidence)

// 清理 OCR 模型资源
clear_ocr_class_mlp (OCRHandle)

// 处理识别结果
tuple_regexp_replace (sum(Class), '0', '0', Result)

// 显示最终识别结果
disp_message (WindowHandle, '获得的结果是' + Result, 'window', 12, 12, 'black', 'true')


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值