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)