☰
Halcon二维码识别
2026/10/2 12:01:29 网站建设 项目流程

我在工业场景遇到的读码项目,一维码的码制一般是Code 128, 对于二维码的是Data Matrix ECC200和QR Code。最近做了一个项目包含了读码项目,码制是Data Matrix ECC 200, 它是一个雕刻在产品上的二维码,难点是因雕刻工艺不稳定,偶尔会重码,就是一个码刻了两次,两次部分重叠在了一起,有时候雕刻的比较浅。对于有色彩的背景上读码,建议用彩色相机。

第一步:Halcon读取二维码,首先是创建读码句柄。

create_data_code_2d_model函数中的GenParamNames和GenParamValues可以设置二维码模型的属性。通过调整这些参数,可以提高解码率并减少解码时间。不同的算法对识别速度有不同的影响。例如,使standard_recognition、enhanced_recognition和maximum_recognition三种级别的值可以分别调整解码能力和解码时间。maximum_recognition虽然解码能力最强,但解码时间也最长。如果第二和第三个参数不填,那就是默认使用standard_recognition。也就是

create_data_code_2d_model('Data Matrix ECC 200', ['default_parameters'], ['standard_recognition'], DataCodeHandle)

想解码能力强,就用maximum_recognition,解码能力强,相应的是牺牲解码速度。

create_data_code_2d_model('Data Matrix ECC 200', ['default_parameters'], ['enhanced_recognition'], DataCodeHandle)

当用参数创建好了二维码句柄,我们可以查阅该算子的说明,看看standard_recognition、enhanced_recognition和maximum_recognition三种级别参数设置值,根据情况做微调整,一般情况下不调整吧,除非真的对它很懂。

第二步:那如何调整参数呢?通过set_data_code_2d_param,如下:

set_data_code_2d_param (DataCodeHandleQR, 'default_parameters', 'enhanced_recognition') set_data_code_2d_param (DataCodeHandleQR, 'timeout', 200) set_data_code_2d_param (DataCodeHandleQR, 'polarity', 'dark_on_light')

第三步:找码, 用函数find_data_code_2d

find_data_code_2d (Image2, SymbolXLDs, DataCodeHandleQR, [], [], ResultHandles, DecodedDataStrings)

第四步(可选):获取 结果get_data_code_2d_results,在上一步骤就可以获取二维码了,这一步主要是获取一些结果参数,例如码的质量

get_data_code_2d_results( : : DataCodeHandle, CandidateHandle, ResultNames : ResultValues)
DataCodeHandle (输入控制) datacode_2d → (整数)
2D数据码模型的句柄。
这个句柄是用来标识具体的2D数据码模型,确保查询操作应用于正确的模型实例。
CandidateHandle (输入控制) integer → (字符串 / 整数)
2D数据码候选对象的句柄或候选对象组的名称。
默认值: 'all_candidates'(所有候选对象),表示将对所有候选对象进行查询。
建议的值包括:0, 1, 2, 'general', 'all_candidates', 'all_results', 'all_undecoded', 'all_aborted',这些值代表不同的候选对象集合或状态。
ResultNames (输入控制) attribute.name(-数组) → (字符串)
要返回的2D数据码识别结果的名称。
默认值: 'status'(状态),这是指解码过程的状态信息。
可选值列表非常广泛,涵盖了从解码状态、错误级别到质量评估等多个方面,例如:
'aborted': 是否被中止
'decoded_string': 解码后的字符串
'contrast': 对比度
'quality_isoiec15415': ISO/IEC 15415质量等级
ResultValues (输出控制) attribute.value(-数组) → (字符串 / 整数 / 浮点数)

第五步(可选):get_data_code_2d_objects 获取二维码读取区域

get_data_code_2d_objects( : DataCodeObjects : DataCodeHandle, CandidateHandle, ObjectName : )
DataCodeObjects (输出对象) object(-数组) → 对象
在2D数据码检测或评估期间创建的中间对象。
这些对象可以是图像中的区域(ROIs)、轮廓(XLDs),或者是处理过程中的图像等,它们有助于理解识别过程和调试问题。

DataCodeHandle (输入控制) datacode_2d → (整数)
2D数据码模型的句柄。
这个句柄用来标识一个具体的2D数据码模型,确保查询操作应用于正确的模型实例。

CandidateHandle (输入控制) integer → (整数 / 字符串)
2D数据码候选对象的句柄或候选对象组的名称。
默认值: 'all_candidates'(所有候选对象),表示将对所有候选对象进行查询。
建议的值包括:0, 1, 2, 'all_candidates', 'all_results', 'all_undecoded', 'all_aborted',这些值代表不同的候选对象集合或状态。

ObjectName (输入控制) string → (字符串)
要返回的图标对象的名称。
默认值: 'candidate_xld'(候选对象的XLD轮廓),这是指围绕可能的数据码符号的轮廓。
可选值列表包含:
'candidate_xld': 候选对象的XLD轮廓;
'module_0_rois': 模块0的感兴趣区域(ROIs);
'module_1_rois': 模块1的感兴趣区域(ROIs);
'process_image': 处理后的图像;
'search_image': 用于搜索的图像。

第六步(可选):query_data_code_2d_params查一些参数

query_data_code_2d_params( : : DataCodeHandle, QueryName : GenParamName)
datacode_2d → (整数)
2D数据码模型的句柄。
这个句柄是用来标识一个具体的2D数据码模型,确保查询操作应用于正确的模型实例。

QueryName (输入控制) attribute.name → (字符串)
参数组的名称。
默认值: 'get_result_params'(获取结果参数),这是指获取与识别结果相关的参数设置。
可选值列表包括了不同的参数组名称,例如:
'find_params': 查找参数,可能涉及到如何在图像中定位数据码;
'get_model_params': 获取模型参数,这可能包含了创建或调整模型时所用的参数;
'get_result_objects': 获取结果对象,这可能是指从图像中成功解码的数据码实体;
'get_result_params': 获取结果参数,涉及解码过程中的配置和阈值等;
'set_model_params': 设置模型参数,用于定义或更改模型的行为。

其实接下来重要的一步骤是,如果解码不成功,怎么办?很多时候都会碰到这样的情况,怎么办?那只能对图像做预处理,然后再查找。这个项目,我们用了彩色相机,我是把图像转成各种通道去尝试读码,用到了mult_image增强对比度,如果当前增强参数读码失败,那么再增加参数数值再读码,多增加几次,就可能读到了。

以下是其它网友给的如何提高解码率的建议,根据自己的情况使用:

如果二维码图像预处理以后,仍旧解码困难或者解码率不高,那么可以通过以下措施进一步提高解码能力:

1、如果整张图信息太多,则可以先把二维码区域挖出来,使用reduce_domain和crop_domain算子,这样不仅可以降低解码难度,还可以减少解码时间。

2、当二维码很小的时候,可以尝试用zoom_image_factor放大了二维码图像。

3、create_data_code_2d_model ('QR Code', [], [], DataCodeHandleQR)

创建模型时,[ ]中不填内容,实际默认属性名是‘default_parameters’,默认属性值是‘standard_recognition’。

如果想大幅度提高解码成功率,可以将属性值置为‘enhanced_recognition’或者‘maximum_recognition’。注意:解码能力越强,解码时间越长。

4、find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, 'train', 'all', ResultHandles, DecodedDataStrings)

该算子中的GenParamNames、GenParamValues默认是空的,就是说直接找,找不到拉倒。如果是'train',就是一面找一面调整模板参数。

默认情况下,它只会最多找到1个二维码。如果想找出更多的二维码(例如3个),可以这样:

find_data_code_2d (Image2, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 3, ResultHandles, DecodedDataStrings)

5、如果对于质量很差的二维码,可以模拟日常手机扫码时的操作,即多次改变曝光,多次解码的方式,参考文章:

机器视觉中提高解码成功率的思路分析 - xh6300 - 博客园

6、通过set_data_code_2d_param算子设置解码时的参数,可以有效提高解码能力。(见下文)

最后源码如下:

read_image (Image1, 'D:/测试图片123/测试图片/2.jpg') *创建二维码句柄 create_data_code_2d_model ('QR Code', [ 'default_parameters'], ['maximum_recognition'], DataCodeHandle) *设置二维码参数 set_data_code_2d_param (DataCodeHandle, 'timeout', 500) *找二维码 find_data_code_2d (Image1, SymbolXLDs, DataCodeHandle, [ 'stop_after_result_num'], [1], ResultHandles, DecodedDataStrings) area_center_xld (SymbolXLDs, Area, Row, Column, PointOrder) dev_disp_text (DecodedDataStrings, 'window', Row, Column, 'black', [], []) *如果找不到码,用图像增强的方法继续找,别无它法,上一个案子我用了mult_image做图像增强循环找 *tuple_length (DecodedDataStrings, Length) get_data_code_2d_results (DataCodeHandle, 'all_candidates', 'status', ResultValues) Min:=10 Max:=200 if(ResultValues!='successfully decoded') for Min := 10 to 50 by 10 for Max := 200 to 250 by 10 mult:=255.0/(Max - Min) add:=-mult*Min scale_image (Image1, ImageScaled2, mult, add) find_data_code_2d (Image1, SymbolXLDs, DataCodeHandle, [ 'stop_after_result_num'], [1], ResultHandles, DecodedDataStrings) tuple_length (DecodedDataStrings, Length) if(Length>0) break endif endfor if(Length>0) break endif endfor endif clear_data_code_2d_model (DataCodeHandle)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询