1. 使用场景
- 同种类型的二维码,比如大小、码制、工艺都一样的
- 需要识别多个,多个大批量识别
- 对作业时间有要求,工业效率有要求
2. 方式选取
- 作业时间有要求就不能采用普通的识别方式
- 因为码制相同,工艺相同,可以采用训练参数来进行设定搜寻二维码的
- 再次正式使用时,加载训练好的参数,用训练好的参数进行解码
3. 训练解码参数
#查找图片存放的文件夹file_exists ('image/newca', FileExists)if(not FileExists) Message := '要训练的路径不存在' dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) return()endif#查找要训练的图片list_image_files ('image/newca', ['png','jpg','bmp'], [], ImageFiles)if (|ImageFiles| = 0) Message := '要训练的图片不存在' dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) return()endif#创建矩阵二维码的默认解析二维码参数 查找默认设定为尽可能的多寻找二维码create_data_code_2d_model ('Data Matrix ECC 200', 'default_parameters', 'maximum_recognition', DataCodeHandle)#设定查找参数 二维码是黑色的 背景是白色的set_data_code_2d_param (DataCodeHandle, 'polarity', 'dark_on_light')dev_open_window (0, 0, 1500, 300, 'black', WindowID)for Index := 0 to |ImageFiles|-1 by 1 dev_clear_window() #根据文件名加载单个图片 read_image(Image, ImageFiles[Index]) #使用9*9的矩形画笔增强原始图片 黑的更黑,白的更白 增加对比对使轮廓更清晰,把二维码从图形中凸显出来 emphasize (Image, image,9, 9, 1) #提升总体灰度,比如原来图片灰度分布在20-220,使用max后拉伸至 0-255 也是为了对比度拉出来 scale_image_max (image, image) #这个最前面加个train代表训练 后面使它的参数 是个数组可以在训练的时候指定其他查找要求,比如这个就是要求查找50个,如果实在没有停止 find_data_code_2d (image, SymbolXLDs, DataCodeHandle, ['train','stop_after_result_num'],['all',50], ResultHandles, DecodedDataStrings) count_obj (SymbolXLDs, Number) if(Number <50) Message := ImageFiles[Index]+'--识别数量不够50' dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) else Message := '识别个数(所有):' + Number dev_disp_text (Message, 'window', 'top', 'left', 'black', [], []) endif *获得中心 area_center_points_xld(SymbolXLDs, Area, Row, Column) wait_seconds (3)endfor#到这里训练的参数已经经过各个图片训练好了。再设定下超时时间参数,为正式使用时,解析时间不超过300MS+-一个搜索周期set_data_code_2d_param (DataCodeHandle, 'timeout', 300)#把训练的参数保存为2d_data_code_model.dcm文件,这个文件在程序运行的同级目录write_data_code_2d_model (DataCodeHandle, '2d_data_code_model.dcm')#解除占用参数clear_data_code_2d_model(DataCodeHandle)
4.使用训练参数搜索图片中的二维码
#读取训练好的解码参数read_data_code_2d_model ('2d_data_code_model.dcm', DataCodeHandle)dev_close_window ()dev_open_window (0, 0, 1500, 300, 'black', WindowID)#读取要作业的图片read_image (Image, 'D:/Image__2023-01-10__09-13-20工作.bmp')#预处理图片 提高对比度emphasize (Image, image,9, 9, 1)scale_image_max (image, image)#开始使用参数读取图片中的二维码find_data_code_2d (image, SymbolXLDs, DataCodeHandle,'stop_after_result_num',50, ResultHandles, DecodedDataStrings)count_obj (SymbolXLDs, Number)clear_data_code_2d_model(DataCodeHandle)
5.原始读取二维码与训练参数读取对比
搜寻耗时1.2S,碰到少于预估数量的,会到4-5S在工业生产中不可忍受。
使用训练参数读取二维码耗时、超时都可控。
一些想法,一些随笔,零零碎碎整理下思路。