halcon(一)一维码解码
(1)解码流程
1)创建条形码模板
create_bar_code_model()
2)设置条形码模型参数
set_bar_code_param()(获取条形码模型参数 )
3)检测和读取图像中的条形码符号
find_bar_code()
4) 获取解读条形码标志时计算得到的结果
get_bar_code_result()
get_bar_code_object()(访问在搜索或解码过程中创建的图标对象)
5) 清除解码模型
clear_bar_code_model()
(2)一些参数配置
参考 【Halcon学习笔记】11.一维条形码检测 - 哔哩哔哩
check_char:是否设置校验符
absent:不检查检验码,所有字符都作为数据返回
present:检查检验码,并用于验证条形码的正确性,如果校验和不匹配,则不返回条码结果
preserved:允许验证条形码,同时仍将校验字符保留在数据中
majority_voting:解码时是否分析多条扫描线(为了减少错误解码结果,应该启用该参数)
false:如果找到最小数目的相同解码扫描线,则返回一个成功的解码结果
true:在不同的扫描线结果之间进行选择
persistence:是否在解码期间存储一些中间结果(想查看解码扫描线时需要存储中间结果)
0:不存储
1:存储
min_identical_scanlines:解码时扫描线的最小数目
contrast_min:条码元素的前景和背景之间的最小对比度(设置最小对比度可再一定程度提高后续检测时间)
meas_param_estimation:增加元素尺寸非常小的条形码的读取性能(条码较小时设置为true可以提高读取性能)
element_size_variable:补偿条形码失真(当条码有变形时设置为true可以再一定程度去补偿失真)
meas_thresh:相对于扫描线像素的动态范围的相对值
meas_thresh_abs:相对于扫描线像素的动态范围的绝对值(对比度)
num_scanlines:解码时所用扫描线的最大数目,设置为0表示自动确定,一般设置为2-30
2)get_bar_code_object()(访问在搜索或解码过程中创建的图标对象)
BarCodeObjects:在条码检测或评估期间作为中间结果创建的对象 BarCodeHandle:条码模型的句柄 CandidateHandle:分别指示需要数据的条码结果候选 ObjectName:要返回的标志性对象的名称 candidate_regions:返回潜在条形码的区域(可能是条形码的区域)
scanlines_all:返回所有扫描线的 XLD 轮廓(包括潜在条形码区域)
scanlines_all_plain:返回所有扫描线的 XLD 轮廓(包括潜在条形码区域)
scanlines_merged_edges:返回表示应用于候选区域的扫描线中特定检测到的条的 XLD 轮廓
scanlines_valid:返回特定检测到条形码扫描线的 XLD 轮廓
scanlines_valid_plain:返回特定检测到条形码扫描线的 XLD 轮廓
symbol_regions:返回成功解码符号的区域
复制 【Halcon学习笔记】11.一维条形码检测 - 哔哩哔哩
create_bar_code_model([],[],BarCodeHandle)read_image(Image, 'barcode/25industrial/25industrial0' + 1)
set_bar_code_param(BarCodeHandle, 'element_size_min', 8)
get_bar_code_param(BarCodeHandle, 'element_size_min', GenParamValue)
set_bar_code_param (BarCodeHandle, 'persistence', 1)set_bar_code_param (BarCodeHandle, 'check_char', 'present')dev_set_color ('green')
IsFindRectangle := falsedev_get_window(windHandle)
if(IsFindRectangle = true)draw_rectangle2(windHandle, Row1, Column1, Row2, Column2,phi)decode_bar_code_rectangle2(Image, BarCodeHandle, 'auto', Row1, Column1, Row2, Column2,phi, DecodedDataStrings)
elsefind_bar_code(Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
endifget_bar_code_result(BarCodeHandle, 'all', 'decoded_types', BarCodeResults)
get_bar_code_object(BarCodeObjects, BarCodeHandle, 'all', 'candidate_regions')gen_contour_region_xld(BarCodeObjects,Contours, 'border')
count_obj (BarCodeObjects, NumberCandidates)
if (NumberCandidates == 0)disp_message (windHandle, 'No candidates found', 'window', 32, 12, 'red', 'true')
elsedev_set_color ('magenta')dev_display (BarCodeObjects)disp_message (windHandle, 'Candidates: ' + NumberCandidates, 'window', 52, 12, 'magenta', 'true')
endif
return ()dev_set_color ('magenta')
disp_message(windHandle, DecodedDataStrings, 'window', 10, 10, 'red', 'false')get_bar_code_object (AllScanlines, BarCodeHandle, 'all', 'scanlines_all')dev_set_color ('red')dev_display (AllScanlines)clear_bar_code_model(BarCodeHandle)
问题查找方法:
参考 https://zhuanlan.zhihu.com/p/647610843
1)查看识别区域是否争取
查看halcon识别出来的条形码区域是否正确。
2)绘制出来多个扫描线
查看扫描线提取是否正确
详细代码请查看 https://zhuanlan.zhihu.com/p/647610843