7.26halcon对条形码识别的学习日志

1.set_bar_code_param (BarCodeHandle, ‘contrast_min’, 120)
*该参数可用于在图像中出现低对比度条形结构时减少find bar code的运行时间。
此外如果预期的条码有高对比度,'contrast_min’也可以用来减少误读的数量。

set_bar_code_param (BarCodeHandleVarSize, ‘element_size_variable’, ‘true’)
在条形码有表面畸变(如柱状畸变时),将参数设置’element_size_variable’为’true’可以更有效地识别出条形码。
set_bar_code_param (BarCodeHandle, ‘majority_voting’, ‘true’)

如果参数’majority_voting’设置为’true’,则会分析所有的扫描线。最终的阅读结果由所有成功的解码结果的多数投票决定。'scanlines_valid’有效扫描线 'scanlines_all’所有扫描线

set_bar_code_param (BarCodeHandle, ‘meas_param_estimation’, ‘true’)
参数’meas_param_estimation’对于提高元素尺寸非常小(1.5像素)的条形码以及模糊和噪声等额外的图像制品的读数性能特别有用。

set_bar_code_param (BarCodeHandle, ‘meas_thresh_abs’, MeasThreshAbsValue)
通过使用值大于0.0的“meas_thresh_abs”,我们强制条形码阅读器只使用扫描线的部分,使其绝对对比度至少为这个值,从而减少了误报率。

参数“num_scanlines”。使用此参数,可以在两种情况下提高性能:

  • -案例1:错误候选目标太多的图片
  • -案例2:堆叠的条码的图像

'orientation’检测条码的角度
'orientation_tol’检测条码的左右范围
‘orientation’=100,‘orientation_tol’=10,检测的范围就为90-110

参数’barcode_height_min’和’barcode_width_min’来缩小在其中搜索可能的条形码的检测候选区域的数量。

2.decode_bar_code_rectangle2 在矩形中识别条码

3.get_bar_code_object
访问在搜索或解码条形码符号期间创建的标志性对象。例程中多用来提取条码轮廓。

4.get_bar_code_result 得到条码符号解码过程中积累的字母数字结果。

5.find_bar_code_timing 确定find_bar_code的运行时

6.gen_quiet_zone_region 得到quiet zone

7.dev_inspect_ctrl 打开一个窗口来检查一个或多个控制变量。

8.获取状态信息。
get_bar_code_result (BarCodeHandle, IndexCandidate, ‘status_id’, StatusID)
get_bar_code_result (BarCodeHandle, IndexCandidate, ‘status’, Status)
要获取状态信息,必须设置参数’persistence’
create_bar_code_model (‘persistence’, 1, BarCodeHandle)

9.query_bar_code_params (BarCodeHandle, ‘trained_general’, TrainParNamesGeneral)
query_bar_code_params (BarCodeHandle, ‘trained_specific’, TrainParNamesSpecific)

TrainParNamesGeneral:
[‘element_size_max’, ‘element_size_min’, ‘barcode_width_min’, ‘meas_thresh’, ‘meas_thresh_abs’]

TrainParNamesSpecific:[‘orientation’, ‘orientation_tol’]

10.处理对比度较低的条码,可以在识别前先用scale_image或者scale_image_range来增强对比度。如果遇到光照不均导致条码识别不出来,可以设置参数将meas_thresh降低到一个非常低的值。当条形码有缺陷时,也可以调整这个参数进行识别。
同时,条码阅读器的鲁棒性强,一些有缺陷的条码仍然可以识别出来。

11.convert_decoded_string_code39_to_code32
将解码后的“Code 39”转换为对应的解码后的“Code 32”条码

12.get_region_runs 访问区域的运行长度编码。

13.这个程序演示了如何使用条形码阅读器的训练模式。
该程序分为两个主要部分。在第一部分中,对条形码阅读器的参数进行了训练。
这通常是在应用程序的脱机阶段完成的。
将经过训练的模型存储到一个文件中,以便在在线阶段使用。
在第二部分,训练模型从文件加载,并用于解码条码在在线阶段的应用。

训练:

create_bar_code_model (‘train’, ‘all’, BarCodeHandle)
get_bar_code_param (BarCodeHandle, ‘train’, TrainParNames)
set_bar_code_param (BarCodeHandle, ‘check_char’, ‘present’)

find_bar_code
query_bar_code_params (BarCodeHandle, ‘trained_general’, TrainParNamesGeneral)
query_bar_code_params (BarCodeHandle, ‘trained_specific’, TrainParNamesSpecific)
get_bar_code_param (BarCodeHandle, TrainParNamesGeneral, TrainParValuesGeneral)
get_bar_code_param_specific (BarCodeHandle, CodeType, TrainParNamesSpecific, TrainParValuesSpecific)

set_bar_code_param (BarCodeHandle, ‘train’, ‘~all’)
get_bar_code_param_specific (BarCodeHandle, CodeType, ‘orientation_tol’, OrientationTol)
set_bar_code_param_specific (BarCodeHandle, CodeType, ‘orientation_tol’, min([1.05 * OrientationTol,90]))

write_bar_code_model (BarCodeHandle, ‘bar_code_model.bcm’)
clear_bar_code_model (BarCodeHandle)

例程:

CodeType := '2/5 Interleaved'
PredefGenParNames := 'check_char'
PredefGenParValues := 'present'
dev_update_off ()
dev_close_window ()
dev_open_window (0, 520, 400, 300, 'white', WindowHandleStatus)
dev_open_window (0, 0, 512, 384, 'black', WindowHandleImage)
set_display_font (WindowHandleStatus, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('green')
FileNames := 'barcode/25interleaved/25interleaved_exposure_' + [1:2:5]$'.02' + '.png'
NumImages := |FileNames|
read_image (TrainImages, FileNames)

create_bar_code_model ('train', 'all', BarCodeHandle)
get_bar_code_param (BarCodeHandle, 'train', TrainParNames)
set_bar_code_param (BarCodeHandle, PredefGenParNames, PredefGenParValues)

for I := 1 to NumImages by 1

    select_obj (TrainImages, Image, I)
    dev_display (Image)
    disp_message (WindowHandleStatus, 'Train bar code ' + I + ' of ' + NumImages + '...', 'window', 12, 12, 'black', 'true')
   
    count_seconds (S1)
    find_bar_code (Image, SymbolRegion, BarCodeHandle, CodeType, DecodedDataStrings)
    count_seconds (S2)
   
    disp_message (WindowHandleStatus, 'Training time: ' + Time$'.2f' + ' ms', 'window', 36, 12, 'black', ['white','false'])
   
    if (|DecodedDataStrings| == 0)
        disp_message (WindowHandleStatus, ['Did not find bar code of type',CodeType + '.','The bar code reader could not be','trained with this image!'], 'window', 60, 12, 'white', 'red')
    else
    	dev_display (SymbolRegion)
        disp_message (WindowHandleStatus, 'Found and trained bar code: ' + DecodedDataStrings, 'window', 60, 12, 'black', ['true','false'])
        query_bar_code_params (BarCodeHandle, 'trained_general', TrainParNamesGeneral)
        query_bar_code_params (BarCodeHandle, 'trained_specific', TrainParNamesSpecific)
        get_bar_code_param (BarCodeHandle, TrainParNamesGeneral, TrainParValuesGeneral)
        get_bar_code_param_specific (BarCodeHandle, CodeType, TrainParNamesSpecific, TrainParValuesSpecific)
        TrainParNames := [TrainParNamesGeneral,TrainParNamesSpecific]
        TrainParValues := [TrainParValuesGeneral,TrainParValuesSpecific]
        Tab := '-' + (max(strlen(TrainParNames)) + 2) + 's'
        disp_message (WindowHandleStatus, (TrainParNames + ': ')$Tab + TrainParValues, 'window', 90, 12, 'black', ['white','false'])
    endif
    if (I < NumImages)
        wait_seconds (1)
    else
        disp_continue_message (WindowHandleStatus, 'black', 'true')
        stop ()
    endif
endfor

set_bar_code_param (BarCodeHandle, 'train', '~all')
get_bar_code_param_specific (BarCodeHandle, CodeType, 'orientation_tol', OrientationTol)
set_bar_code_param_specific (BarCodeHandle, CodeType, 'orientation_tol', min([1.05 * OrientationTol,90]))

write_bar_code_model (BarCodeHandle, 'bar_code_model.bcm')
clear_bar_code_model (BarCodeHandle)

dev_set_window (WindowHandleStatus)
dev_clear_window ()
dev_set_window (WindowHandleImage)

read_bar_code_model ('bar_code_model.bcm', BarCodeHandle)

FileNames := 'barcode/25interleaved/25interleaved_exposure_' + [1:5]$'.02' + '.png'
NumImages := |FileNames|
read_image (TrainImages, FileNames)

for I := 1 to NumImages by 1
   
    select_obj (TrainImages, Image, I)
    dev_display (Image)
    disp_message (WindowHandleStatus, 'Read bar code ' + I + ' of ' + NumImages + '...', 'window', 12, 12, 'black', 'true')
  
    count_seconds (S1)
    find_bar_code (Image, SymbolRegion, BarCodeHandle, CodeType, DecodedDataStrings)
    count_seconds (S2)
    
    Time := (S2 - S1) * 1000
    disp_message (WindowHandleStatus, 'Reading time: ' + Time$'.2f' + ' ms', 'window', 36, 12, 'black', ['white','false'])
    
    if (|DecodedDataStrings| == 0)
        disp_message (WindowHandleStatus, ['Did not find bar code of type',CodeType + '.'], 'window', 60, 12, 'white', 'red')
    else
        dev_display (SymbolRegion)
        disp_message (WindowHandleStatus, 'Found bar code: ' + DecodedDataStrings, 'window', 60, 12, 'black', ['true','false'])
    endif
    if (I < NumImages)
        wait_seconds (1)
    endif
endfor
clear_bar_code_model (BarCodeHandle)
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值