近期要往一个大型软件里面增加一个扫码工具,想到基于halcon算子进行开发,记录一下开发过程中的采坑和要点。
刚开始拿到现场的二维码数据集,基于halcon进行测试,发现根本识别不了,无法有效获得二维码信息。基于halcon识别二维码的核心算子为下面两个:
create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters','enhanced_recognition', Handle)
find_data_code_2d (Image2, QRXLDs, QRHandle, 'stop_after_result_num', 4, ResultHandles, PositionStrings)
在这里卡住了很久,对创建的识别二维码的模型设置各类参数,也无法有效识别,对halcon二维码的识别一度产生怀疑。
后来,在想是不是需要对图片加一些预处理,调整带有二维码图片的灰度分布,再来识别,把同事加预处理识别二维码程序搞过来了,如下:
read_image (Image, ImageFiles[Index])
dev_close_window ()
dev_open_window (0, 0, 800, 600, 'black', WindowHandle)
rgb1_to_gray (Image, GrayImage)
create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'enhanced_recognition', QRHandle)
*******************识别出二维码
Length := 0
PositionStrings := []
for min_gray := 0 to 30 by 3
for max_gray := 255 to 180 by -7
*灰度线性映射
Mult:=255.0/(max_gray-min_gray)
Add:=-Mult*min_gray
scale_image (GrayImage, Image2, Mult, Add)
find_data_code_2d (Image2, QRXLDs, QRHandle, 'stop_after_result_num', 4, ResultHandles, PositionStrings)
tuple_strlen (PositionStrings, Length)
*字符串大于5就是识别出来了
if (Length > 5)
break
endif
endfor
if (Length > 5)
break
endif
endfor
********释放内存
clear_data_code_2d_model(QRHandle)
终于可以识别部分二维码图片,但也是只针对小部分图片,大部分图片无法有效识别。
但到这里,还是看到了识别的希望,接下来放大招,能够稳定有效地识别图片中的二维码,先说下识别思路。
对图片进行通道分解,基于RGB和HSV通道分解得到六个通道的图片,基于这六张图片进行二维码识别,测试结果表明基于S通道的图片二维码识别,在图片保证清晰的情况下,识别率将近99%以上。以下是halcon代码:
read_image (Image, ImageFiles[Index])
*分解图片为三通道
decompose3 (Image, ImageR, ImageG, ImageB)
*分解成HSV通道
trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')
rgb1_to_gray (Image, GrayImage)
get_image_size (GrayImage, Width, Height)
dev_open_window (0, 0, 800, 600, 'black', WindowHandle)
InputImage:=Image
create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'enhanced_recognition', DataCodeHandle)
set_data_code_2d_param (DataCodeHandle, 'polarity', 'dark_on_light')
set_data_code_2d_param (DataCodeHandle, 'symbol_shape', 'rectangle')
*set_data_code_2d_param (DataCodeHandle, 'timeout', delayTime)
*set_data_code_2d_param (DataCodeHandle, 'symbol_size_min', minSize)
*set_data_code_2d_param (DataCodeHandle, 'symbol_size_max', maxSize)
*set_data_code_2d_param (DataCodeHandle, 'mirrored', 'no')
*set_data_code_2d_param (DataCodeHandle, 'contrast_min', minContrast)
*开始找码
find_data_code_2d (ImageS, SymbolXLDs, DataCodeHandle, 'stop_after_result_num', 4, ResultHandles, DecodedDataStrings)
disp_message (WindowHandle, '识别结果:'+DecodedDataStrings, 'window', 20, 20, 'red', 'true')
clear_data_code_2d_model (DataCodeHandle)