在扫描条形码时,可以在事先确定的条码矩形区域内,通过设置多条扫描线进行条码识别。
每条扫描线扫描的结果都相同才表示扫码成功。
当前实例实现 使用最少两条扫描线识别条形码功能。
代码和注释如下:
2.3 halcon通过带扫描线识别条形码
- dev_close_window()
- dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
- dev_set_draw ('margin')
- dev_update_window ('off')
- dev_set_line_width (2)
- Files := ['ean1314','ean1313']
- *创建条形码模型句柄。
- create_bar_code_model ([], [], BarCodeHandle)
- *设置要查找的条码的最小宽度参数,也就是黑色和白色矩形 条沿着扫描方向的最小宽度
- set_bar_code_param (BarCodeHandle, 'element_size_min', 1.5)
- *设置要查找条码的解码过程的中间结果是否保存,1是,0,否。
- set_bar_code_param (BarCodeHandle, 'persistence', 1)
- *设置最少使用两条扫描线进行计算,结果相同才认为结果正确
- set_bar_code_param (BarCodeHandle, 'min_identical_scanlines', 2)
- for I :=0 to |Files|-1 by 1
- Filename := 'barcode/ean13/'+Files[I]
- read_image (Image, Filename)
- get_image_size (Image, Width, Height)
- dev_set_window_extents(0,0,Width, Height)
- dev_display (Image)
- *在图片中开始查找条码,字符结果保存在DecodedDataStrings,条码区域保存在SymbolRegions
- find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
- if(|DecodedDataStrings|)
- CandidatesIds := [0:|DecodedDataStrings|-1]
- else
- CandidatesIds := 'all'
- endif
- *获取条码计算的中间结果:条码区域
- get_bar_code_object(Candidates, BarCodeHandle, CandidatesIds, 'candidate_regions')
- dev_set_color ('green')
- dev_display (Candidates)
- *获取条码计算的中间结果:扫描线
- get_bar_code_object(ValidScanLines, BarCodeHandle, CandidatesIds, 'scanlines_valid')
- dev_set_color ('yellow')
- dev_display (ValidScanLines)
- if(I<|Files|)
- disp_continue_message(WindowHandle, 'black', 'true')
- stop()
- endif
- endfor
- clear_bar_code_model (BarCodeHandle)
复制代码
一维码识别相关函数也就16个。
一维码识别相关函数也就16个
可按下F1,结合手册查阅这些函数,
下面是结合代码,一步步执行查看每个函数的执行效果。
从而熟悉每个函数的作用与使用场景。
- dev_close_window ()
- dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
- *读取图片,用于条码识别
- read_image (Image, 'barcode/mixed/barcode_mixed_02')
- dev_display (Image)
- *创建条码模型句柄,用于后面条码识别
- create_bar_code_model ([], [], BarCodeHandle)
- *设置条码识别过程中,中间变量是否保留,1保留,0不保留,为1时下面get_bar_code_object才有效
- set_bar_code_param (BarCodeHandle, 'persistence', 1)
- *执行条码查找,结果字符串保存在DecodedDataStrings,条码所在区域保存在SymbolRegions
- find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
- *获取条码识别过程中的中间变量:扫描线;
- get_bar_code_object (Scallines, BarCodeHandle, 'all', 'scanlines_valid')
- *获取条码识别的设置参数。和set_bar_code_param对应。
- get_bar_code_param (BarCodeHandle, 'persistence', GenParamValue)
- *获取所有可以在get_bar_code_param和set_bar_code_param函数中使用的条码参数
- query_bar_code_params (BarCodeHandle, 'all', GenParamName)
- *将条码句柄(包含设置信息)保存到磁盘,供后期读取使用。
- write_bar_code_model (BarCodeHandle, 'bar_code_model.bcm')
- *清静条码句柄,释放内存资源。
- clear_bar_code_model (BarCodeHandle)
- *从事先 保存的文件读取条码句柄,并进行读码操作。
- read_bar_code_model('bar_code_model.bcm', BarCodeHandle)
- find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
- get_bar_code_object (Scallines, BarCodeHandle, 'all', 'scanlines_valid')
- *串行化条码句柄(包含设置信息),并保存到磁盘.
- serialize_bar_code_model (BarCodeHandle, SerializedItemHandle)
- open_file('123.bin','output_binary',FileHandle)
- fwrite_serialized_item (FileHandle, SerializedItemHandle)
- close_file (FileHandle)
- clear_bar_code_model (BarCodeHandle)
- *从磁盘读取事先串行化的文件到条码句柄,并进行条码识别;
- open_file('123.bin','input_binary',FileHandle)
- fread_serialized_item (FileHandle, SerializedItemHandle)
- deserialize_bar_code_model (SerializedItemHandle, BarCodeHandle)
- find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
- get_bar_code_object (Scallines, BarCodeHandle, 'all', 'scanlines_valid')
- *获取成功解码后的一些信息,如条码类型decoded_types,条码字符串decoded_strings
- get_bar_code_result (BarCodeHandle, 'all', 'decoded_strings', BarCodeResults)
- *为指定类型的条码设置参数
- set_bar_code_param_specific (BarCodeHandle, ['EAN-13','Code 39'] ,'orientation', [90.0,0.0])
- find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
- *获取指定类型条码的参数
- get_bar_code_param_specific (BarCodeHandle, ['EAN-13','Code 39'], 'orientation_tol', GenParamValue)
- dev_display(Image)
- Row:=475
- Column:=465
- Phi:=0.07
- Length1:=265
- Length2 :=80
- *在图片指定区域内读取条码。
- decode_bar_code_rectangle2 (Image, BarCodeHandle, 'Code 39', Row, Column, Phi, Length1, Length2, DecodedDataStrings)
- *当读取的条码类型是Code 32时,其结果可用此函数转换为Code 39类型字符串。
- convert_decoded_string_code39_to_code32(DecodedDataStrings, ConvertedDataStringCode32)
复制代码
|