😊😁😆😗😂😲
真开心,又到了写blog的时间了。
题外话:
https://www.2weima.com/
这个链接可以免费生成二维码,我们要善于使用二维码。
😗😂😗😂😗😂😗😂。
想想,当需要和别人说一些难以启齿的话,通过发个二维码给他让他识别是不是很有创意。
而且,看下面的二维码是不是也很beautiful。
小伙伴们感兴趣的可以尝试一下,都是免费的。
开始正题:
最近在做二维码识别相关的任务,简单的读了下Halcon文档,现在做一些总结。
先简单介绍下halcon能识别哪些二维码吧,如果没有你想要的码类,那只能额外想办法了。
二维码种类
Halcon封装了多种二维码类型识别供选择,最常见的如QRcode、PDF417、Aztec Code、Data Matrix ECC 200、Micro QR Code等五种。当然还有一些其它的,具体选用哪种,看自己的需求吧,如果项目不确定,可以把这五种都加进去。
从左到右分别是
Data Matrix ECC 200, QR Code, Micro QR Code, and Aztec Code.
我们生活中最常用的是QRCode。 样式如下所示
上述链接提供调参接口。
可以看到里面有一个纠错等级,一共有四类,分别为L、M、Q、H四种。纠错等级在我们的二维码受损时候显得比较重要,比如在工业中,二维码经常会有缺失,这时候可以选择Q或者H类的二维码去制作。
还可以选择加一些噪声点,对二维码进行旋转,把三个定位符改变形状等设置。
这些是制作二维码时候的注意点,我目前的工作主要是去识别二维码,这些只是当作简单的了解。
识别步骤
Halcon把识别步骤封装的特别简单。当待识别图像质量比较好的时候,基本上两个算子就可以识别出二维码内容。
1、创建句柄,设参数。
create_data_code_2d_model( : : SymbolType, GenParamName, GenParamValue : DataCodeHandle)
SymbolType:二维码类型,这一步一定要确认输入正确的类型,否则识别结果肯定为错。
默认类型为 Data Matrix ECC 200。
这里贴一张Halcon使用手册里面对各个二维码的介绍表。
其中一些参数是你可以设置的,比如Polarity、Timeout等。
当前在识别简单二维码、不考虑性能的时候,我们可以都不改,直接设置个二维码类型,就进入下一步阶段
2、寻找二维码
是的,最简单的就只有两个步骤。第一步设置类型,第二步就可以寻找了。
😮😮😮😮😮😮
find_data_code_2d(Image : SymbolXLDs : DataCodeHandle, GenParamName, GenParamValue : ResultHandles, DecodedDataStrings)
这一步我们只需要输入待识别的图像即可,Halcon会自动去识别图像中的二维码,将二维码轮廓在 SymbolXLDs 中输出, 将识别结果以字符串的形式在 DecodedDataStrings 中输出。
也就是说,我们想识别简单、图像质量好的二维码,就只需要两个步骤,一个设置二维码类型,两一个就是设置待识别的图像。是不是 So easy。✌️✌️✌️✌️✌️✌️
最后别忘了,clear一下,
clear_data_code_2d_model (DataCodeHandle)
当然,在实际项目中你肯定要考虑效率,图像质量等方面因素了😤😤😤😤😤😤
效率
如何提升find速度呢,可以从两个方面去考虑。
Region of Interest
如果不设置区域,Halcon是在你输入的全图上进行搜索定位。那假如图比较大,是不是会浪费搜索的时间呢?
所以我们第一个应该考虑的就是ROI区域,在工业中,如果相机采的图都在大致的一个位置,那我们就可以使用创建矩形等方式,把这块区域提取出来,再把所在区域的图像裁剪出来,对这块图像进行搜索,这样就可以显著提升识别的效率。
例如,通过使用操作符gen_rectangle1 创建一个矩形。读取图像后,使用操作符reduce_domain。将图像域缩小到这个特定的矩形区域。然后使用操作符find_data_code_2d中使用简化的图像,而不是原始图像。
Set model parameters
调整模型参数会显著影响算子find_data_code_2d 的运行时间。因此,加快它速度的第二种方法是将所有参数限制在特定符号表示所需的最小值范围内。
例如,如果将“polarity”设置为“any”,则在第一个通道中搜索“dark_on_light”符号。如果没有找到,第二次搜索“light_on_dark”符号。因此,限制极性会显著提高速度。
每个过程包括两个阶段,搜索阶段和评估阶段。搜索阶段用于查找查找器模式,并为每个检测到的查找器模式生成候选符号。评估阶段用于调查较低金字塔水平的候选人,如果可能的话,阅读他们。当成功解码或执行最后一次传递时,操作符find_data_code_2d终止。这就解释了为什么当首先检查正确的参数值时,符号搜索相当快,而当必须检查范围广泛的参数值,但没有找到请求的符号数量时,需要更长的时间。
Suggestion :
如果运行效率对程序很重要,则应特别注意以下属性的模型参数:
- polarity,
- minimum module size,
- number of symbol rows (for PDF417, especially for strongly cluttered or textured images),
- module gaps (for matrix codes with very small modules),
- the minimum number of position detection patterns (for QR codes), and
- the use of additional pyramid levels (additional_levels) as well as the setting of the tolerance while looking for the finder pattern (finder_pattern_tolerance (for Aztec Codes)).
如果这些参数设置不正确或范围有不必要的宽,搜索过程就会减慢,特别是当找不到请求的符号数量时。
可以用算子get_data_code_2d_results进行查询这些符号的实际值
保存
在通过参数设置更改参数设置后,可以使用算子write_data_code_2d_model将新模型存储在一个文件中。
参考例程 《hdevelop\Identification\Data-Code\ecc200_training.hdev》
保存
识别
图像处理
好的图像事半功倍,不好的图像事倍功半。
但Halcon在算子里面也进行了一些预处理的操作,比如针对旋转图像,倾斜图像,都是可以识别的。
Halcon提供三种模式选择。分别是’standard_recognition’、‘enhanced_recognition’ 、‘maximum_recognition’,在这里继续贴一张图便于理解。
Slant Image
在处理倾斜图像时要注意,斜切角度小的是可以检测出来的。但是在不同模式下检测允许的最大角度不同。standard mode最大检测斜切角度是0.1745(10°),在enhanced mode下,最大的检测角度为0.5235(30°)。如果超过这个范围就要使用投影变换,将倾斜图像校正。一般方法是找到二维码的四个角点,做投影。
可以参考Halcon例程
《hdevelop\Identification\Data-Code\2d_data_codesrectify_symbol.hdev》
Large Module Gaps
对于 matrix codes,模块之间的间隙允许在一定的范围内。
可以参考Halcon例程
《hdevelop\Identification\Data-Code\2d_data_codes_minimize_module_gaps》
主要算子如下:
结果如下:
Noise
对于二维码的检测,背景和前景应该可以清晰地区分出来,即模块应该由均匀的或至少是低纹理的区域组成。如果因为图像中存在太多的纹理或噪声而无法读取符号,则可以尝试使用灰度值形态、中值滤波器或两者的组合对图像进行预处理。
可以参考Halcon例程
《hdevelop\Identification\Data-Code\2d_data_codes_minimize_noise.》
其它
一般来说,Halcon的算子已经可以处理很多图像了,当然一些特殊情况也做不到都能识别。针对其它的特殊情况需要特殊考虑,特事特办。
总结
快乐时光如此短暂。
💔💔💔💔💔💔
今天写blog的时间就到这里吧,halcon算子还是很强的,我作为一个初学者,也只是学到了这些皮毛,就做一个简答的分享吧,更深入的大佬们可以去查看英文文档。