基于Halcon学习的一维码识别【六】barcode.param_majority_voting.hdev

该示例程序显示了条形码参数'majority_voting'的效果。条形码阅读器分析多条扫描线,并尝试对其进行解码。默认情况下,一旦一条扫描线被成功解码,该过程就会终止。在某些情况下,由于本地打印错误,由此扫描线得出的结果可能是错误的。如果参数'majority_voting'设置为“真”,则分析所有扫描线。最终的读取结果由所有成功解码结果的多数投票决定。


 总代码:

* Prepare visualization settings and objects
dev_update_off ()
dev_close_window ()
read_image (Image, 'barcode/ean13/ean13_label')
get_image_size (Image, WidthI, HeightI)
dev_open_window_fit_image (Image, 0, 0, 600, 500, WindowHandle)
dev_display (Image)
dev_set_draw ('margin')
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
get_window_extents (WindowHandle, Row, Column, Width, Height)
WindowZoomFactor := real(WidthI) / Width

*打开新的窗口用来显示字体
dev_open_window (0, Width + 5, 400, 300, 'white', WindowHandleText)
set_display_font (WindowHandleText, 14, 'mono', 'true', 'false')
* 
* Create bar code reader model
*创建一个模型
create_bar_code_model ([], [], BarCodeHandle)
* 
* PART I, read bar code without majority voting
*第一部分,未经多数表决阅读条形码
MajorityVotingSetting := 'false'
set_bar_code_param (BarCodeHandle, 'majority_voting', MajorityVotingSetting)
*持续模式解码、使其在条形码解码期间存储一些中间结果
*启用“持久性”模式会增加条形码模型结构的内存需求
set_bar_code_param (BarCodeHandle, 'persistence', 1)
*定义了一个阈值,该阈值是相对于扫描线像素动态范围的相对值
*如果条形码区域出现干扰或噪声水平较高,“meas_thresh”的值应增
set_bar_code_param (BarCodeHandle, 'meas_thresh', 0.1)
*如果基于“meas_thresh”的阈值小于“meas_thresh_abs”的值,则将后者用作阈值
*较大的值可能更适合于高噪声级别的图像。
set_bar_code_param (BarCodeHandle, 'meas_thresh_abs', 30)
* 
* Perform decoding and prepare results
dev_set_window (WindowHandle)
decode_bar_code_rectangle2 (Image, BarCodeHandle, 'EAN-13', 280, 223, 3.14125 / 2.0, 200, 50, DecodedDataStrings)
*获得中间结果的局域
get_bar_code_object (SymbolRegion, BarCodeHandle, 'all', 'symbol_regions')
*获得解码的类型
get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', DecodedTypes)
*获得解码的字符串信息
get_bar_code_result (BarCodeHandle, 'all', 'decoded_strings', DecodedData)
*获得中间结果的有效扫描线

get_bar_code_object (ValidScanlines, BarCodeHandle, 'all', 'scanlines_valid')
get_majority_voting_example_symbols (SymbolRegion, ValidScanlines, DecodedData, BarCodeHandle, DecodedTypes, DecodedData)
*选中的扫描线,5是第几条的意思
*一般用的是中间那根,挑选出比较常用的扫描线
select_obj (ValidScanlines, FirstScanline, 5)
* 
* Display results and labels
disp_message (WindowHandle, ['Looking for bar codes','\'majority_voting\' = \'' + MajorityVotingSetting + '\''], 'window', 12, 12, 'black', 'true')
ColorsText := ['forest green','red']
dev_set_line_width (2)
smallest_rectangle1 (SymbolRegion, Row1, Column1, Row2, Column2)
dev_set_color ('red')
dev_display (SymbolRegion)
dev_display (FirstScanline)
* 
Message := ['Codetype: ','Data:     '] + [DecodedTypes,DecodedData]
disp_message (WindowHandle, Message, 'image', Row1 - 40 * WindowZoomFactor, Column2 - 100, ColorsText[1], 'true')
* 
* Display description
Message := 'By default \'majority_voting\' is set to \'false\'.'
Message[1] := ' '
Message[2] := 'If the parameter \'majority_voting\' is set to \'false\', the reading result is set to the decoding result of the first scanline that could be decoded.'
Message[3] := ' '
Message[4] := 'Here, an \'EAN-13\' code is detected wrongly inside of another \'EAN-13\' because of a printing error.'
MessageWrapped := regexp_replace(Message + ' ',['(.{0,35})\\s','replace_all'],'$1\n')
disp_message (WindowHandleText, MessageWrapped, 'window', 12, 12, 'black', 'false')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* PART II, enable majority voting
* 
MajorityVotingSetting := 'true'
set_bar_code_param (BarCodeHandle, 'majority_voting', MajorityVotingSetting)
* 
* Perform decoding and prepare results
decode_bar_code_rectangle2 (Image, BarCodeHandle, 'EAN-13', 280, 223, 3.14125 / 2.0, 200, 50, DecodedDataStrings)
get_bar_code_object (SymbolRegion, BarCodeHandle, 'all', 'symbol_regions')
get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', DecodedTypes)
get_bar_code_result (BarCodeHandle, 'all', 'decoded_strings', DecodedData)
get_bar_code_object (ValidScanlines, BarCodeHandle, 'all', 'scanlines_valid')
select_obj (ValidScanlines, MajorityScanlines, [[1:4],6,7])
* 
* Display results and labels
dev_display (Image)
disp_message (WindowHandle, ['Looking for bar codes','\'majority_voting\' = \'' + MajorityVotingSetting + '\''], 'window', 12, 12, 'black', 'true')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (2)
smallest_rectangle1 (SymbolRegion, Row1, Column1, Row2, Column2)
dev_display (SymbolRegion)
dev_display (MajorityScanlines)
Message := ['Codetype: ','Data:     '] + [DecodedTypes,DecodedData]
disp_message (WindowHandle, Message, 'image', Row1 - 40 * WindowZoomFactor, Column2 - 100, 'forest green', 'true')
* 
* Display description
dev_set_window (WindowHandleText)
Message := 'If majority voting is enabled, the bar code reader uses a majority voting scheme to determine the reading results. It returns the result that has been decoded from the majority of all scanlines.'
Message[1] := ' '
Message[2] := 'Here, the correct \'EAN-13\' code is found.'
MessageWrapped := regexp_replace(Message + ' ',['(.{0,35})\\s','replace_all'],'$1\n')
dev_clear_window ()
disp_message (WindowHandleText, MessageWrapped, 'window', 12, 12, 'black', 'false')
stop ()
* 
* Clean up memory
clear_bar_code_model (BarCodeHandle)

逐段分析:

*准备可视化设置和对象
*关闭窗体更新
dev_update_off ()
dev_close_window ()

*读取图片
read_image (Image, 'barcode/ean13/ean13_label')
get_image_size (Image, WidthI, HeightI)

*设置图片自适应窗口大小
dev_open_window_fit_image (Image, 0, 0, 600, 500, WindowHandle)
dev_display (Image)
dev_set_draw ('margin')
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')

*得到窗口的行列坐标以及宽和高
get_window_extents (WindowHandle, Row, Column, Width, Height)

*定义窗体放大因子
WindowZoomFactor := real(WidthI) / Width

*打开新的窗口用来显示字体
dev_open_window (0, Width + 5, 400, 300, 'white', WindowHandleText)
set_display_font (WindowHandleText, 14, 'mono', 'true', 'false')

*创建一个模型
create_bar_code_model ([], [], BarCodeHandle)

*第一部分,设置参数为false
MajorityVotingSetting := 'false'
set_bar_code_param (BarCodeHandle, 'majority_voting', MajorityVotingSetting)

*持续模式解码、使其在条形码解码期间存储一些中间结果
*启用“持久性”模式会增加条形码模型结构的内存需求
set_bar_code_param (BarCodeHandle, 'persistence', 1)

*定义了一个阈值,该阈值是相对于扫描线像素动态范围的相对值
*如果条形码区域出现干扰或噪声水平较高,“meas_thresh”的值应增
set_bar_code_param (BarCodeHandle, 'meas_thresh', 0.1)

*如果基于“meas_thresh”的阈值小于“meas_thresh_abs”的值,则将后者用作阈值
*较大的值可能更适合于高噪声级别的图像。
set_bar_code_param (BarCodeHandle, 'meas_thresh_abs', 30)

*执行解码并准备结果
*设置活动窗口
dev_set_window (WindowHandle)
decode_bar_code_rectangle2 (Image, BarCodeHandle, 'EAN-13', 280, 223, 3.14125 / 2.0, 200, 50, DecodedDataStrings)

*获得中间结果的局域
get_bar_code_object (SymbolRegion, BarCodeHandle, 'all', 'symbol_regions')

*获得解码的类型
get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', DecodedTypes)

*获得解码的字符串信息
get_bar_code_result (BarCodeHandle, 'all', 'decoded_strings', DecodedData)

*获得中间结果的有效扫描线
get_bar_code_object (ValidScanlines, BarCodeHandle, 'all', 'scanlines_valid')

*得到所有扫描线
get_majority_voting_example_symbols (SymbolRegion, ValidScanlines, DecodedData, BarCodeHandle, DecodedTypes, DecodedData)

*选中的扫描线,5是第几条的意思
*一般用的是中间那根,挑选出比较常用的扫描线
select_obj (ValidScanlines, FirstScanline, 5)

*显示信息
disp_message (WindowHandle, ['Looking for bar codes','\'majority_voting\' = \'' + MajorityVotingSetting + '\''], 'window', 12, 12, 'black', 'true')

ColorsText := ['forest green','red']
*设置线宽
dev_set_line_width (2)

*获得一维码区域的行列坐标
smallest_rectangle1 (SymbolRegion, Row1, Column1, Row2, Column2)
dev_set_color ('red')
dev_display (SymbolRegion)

*显示扫描线
dev_display (FirstScanline)

Message := ['Codetype: ','Data:     '] + [DecodedTypes,DecodedData]
*显示信息
disp_message (WindowHandle, Message, 'image', Row1 - 40 * WindowZoomFactor, Column2 - 100, ColorsText[1], 'true')
*

*显示描述
Message := 'By default \'majority_voting\' is set to \'false\'.'
Message[1] := ' '
Message[2] := 'If the parameter \'majority_voting\' is set to \'false\', the reading result is set to the decoding result of the first scanline that could be decoded.'
Message[3] := ' '
Message[4] := 'Here, an \'EAN-13\' code is detected wrongly inside of another \'EAN-13\' because of a printing error.'
MessageWrapped := regexp_replace(Message + ' ',['(.{0,35})\\s','replace_all'],'$1\n')

*在文字窗口显示信息
disp_message (WindowHandleText, MessageWrapped, 'window', 12, 12, 'black', 'false')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

*第二部分
*参数设置成true
MajorityVotingSetting := 'true'
set_bar_code_param (BarCodeHandle, 'majority_voting', MajorityVotingSetting)


*执行解码并准备结果
decode_bar_code_rectangle2 (Image, BarCodeHandle, 'EAN-13', 280, 223, 3.14125 / 2.0, 200, 50, DecodedDataStrings)

*获得中间结果的局域
get_bar_code_object (SymbolRegion, BarCodeHandle, 'all', 'symbol_regions')

*获得解码的类型
get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', DecodedTypes)

*获得解码的字符串信息
get_bar_code_result (BarCodeHandle, 'all', 'decoded_strings', DecodedData)

*获得中间结果的有效扫描线
get_bar_code_object (ValidScanlines, BarCodeHandle, 'all', 'scanlines_valid')

*选择1-4条、6、7条扫描线
select_obj (ValidScanlines, MajorityScanlines, [[1:4],6,7])


*显示结果和标签
dev_display (Image)
disp_message (WindowHandle, ['Looking for bar codes','\'majority_voting\' = \'' + MajorityVotingSetting + '\''], 'window', 12, 12, 'black', 'true')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (2)

*获得区域的行列坐标
smallest_rectangle1 (SymbolRegion, Row1, Column1, Row2, Column2)
dev_display (SymbolRegion)
dev_display (MajorityScanlines)
Message := ['Codetype: ','Data:     '] + [DecodedTypes,DecodedData]

*显示信息
disp_message (WindowHandle, Message, 'image', Row1 - 40 * WindowZoomFactor, Column2 - 100, 'forest green', 'true')

*显示描述
*设置活动窗口
dev_set_window (WindowHandleText)
Message := 'If majority voting is enabled, the bar code reader uses a majority voting scheme to determine the reading results. It returns the result that has been decoded from the majority of all scanlines.'
Message[1] := ' '
Message[2] := 'Here, the correct \'EAN-13\' code is found.'
MessageWrapped := regexp_replace(Message + ' ',['(.{0,35})\\s','replace_all'],'$1\n')

*清除窗口
dev_clear_window ()
disp_message (WindowHandleText, MessageWrapped, 'window', 12, 12, 'black', 'false')
stop ()

*清除模型句柄
clear_bar_code_model (BarCodeHandle)

主要参数分析:

'majority_voting':

此参数控制解码结果选择模式。如果此参数为“false”,则如果找到最小数量的相同解码扫描线,将返回成功的解码结果。通过将此参数设置为“真”,多数投票方案用于在不同扫描线结果之间进行选择。大多数扫描线解码的结果被选为整体结果。请注意,将此参数设置为“true”会导致运行时间略微增加,因为几乎所有扫描线都必须考虑,而不仅仅是最小的相同扫描线。

为了减少错误解码结果,应启用此参数。

此参数仅适用于非堆叠条形码类型。

值列表:[“假”、“真”]

默认值:“false”

'meas_thresh':

“meas_thresh”定义了一个阈值,该阈值是相对于扫描线像素动态范围的相对值。条形码的条形码空间序列由测量边缘位置的扫描线确定。找到这些边需要上述阈值。如果条形码区域出现干扰或噪声水平较高,“meas_thresh”的值应增加。

典型值:[0.05…0.2]

默认值:0.05

 'meas_thresh_abs':

如果扫描线放置在没有或只有非常小的灰度值动态范围的图像区域(例如,在所有灰度值接近255的白色区域),基于“meas_thresh”的边缘检测阈值将被计算得非常小。这通常会导致检测到大量假边缘。”meas_thresh_abs’用于防止此类误判。如果基于“meas_thresh”的阈值小于“meas_thresh_abs”的值,则将后者用作阈值。默认情况下,“meas_thresh_abs”设置为5.0。较大的值可能更适合于高噪声级别的图像。另一方面,在对比度非常弱的无噪图像中,此参数可能会干扰真实边缘的检测,因此可能需要将其减小,甚至通过将其设置为0.0来完全禁用。

典型值:[0.0…10.0]

默认值:5.0

 'persistence':

将持久模式下的模型设置为1,使其在条形码解码期间存储一些中间结果。如果必须评估条形码打印质量(使用“质量”或“isoiec15416”获取条形码结果)或必须检查解码扫描线(使用“扫描线”或“扫描线有效”获取条形码对象),则需要这些结果。然而,启用“持久性”模式会增加条形码模型结构的内存需求。

值列表:[0,1]

默认值:0

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值