首页 / 资讯中心 / 文章详情

Halcon二维码识别

Halcon二维码识别 ★ FEATURED ARTICLE
我在工业场景遇到的读码项目一维码的码制一般是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_2dfind_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的感兴趣区域ROIsmodule_1_rois: 模块1的感兴趣区域ROIsprocess_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(Length0) break endif endfor if(Length0) break endif endfor endif clear_data_code_2d_model (DataCodeHandle)
阅读完成 · 觉得有帮助?
咨询建站