文章目录
前言
- 需要下载安装OpenCV工具包的朋友,请前往 此处 ;
- 系统要求:Windows系统,LabVIEW>=2018,兼容32位和64位。
二维码(QRCode)
这里说的二维码,指的是我们日常生活最常用的那种二维码 - QRCode。另外还有一种叫 Aruco ,也属于二维码,将在其他教程里解说。
本文所有图片中的二维码,均作了 “模糊化” 处理,以防被 优快云 认定为违规。
1. 生成QRCode
生成 QRCode 二维码,可以使用 objdetect 模块下的 QRCodeEncoder 类,选板如图。
1.1 生成单一QRCode
- 使用 QRCodeEncoder 类简单地生成一个二维码,函数调用流程为 create - encode - release;
- create 函数可以设置二维码的 版本、纠错等级、模式等;
(structure_number 参数仅当 mode = MODE_STRUCTURED_APPEND 时才有效) - 通过 encode 生成的二维码图像尺寸很小(每个编码只占1个像素),所以使用 imgproc 模块下的 resize 函数将它放大,以便观察;
(注意,这个 resize 与 Mat 类内置的 resize 是完全不同的!) - 完整流程如下图:
1.2 生成 “结构化附加” 二维码组
当需要编码的信息,超过单个二维码所能容纳的极限时,可以考虑使用 “结构化附加” 模式。这种模式下,信息会被自动分割,生成多个二维码。
- 在 create 的参数里,设置 mode = MODE_STRUCTURED_APPEND,并设置结构数量 structure_number;
- 使用 encodeStructuredAppend 函数生成二维码数组,同样用 resize 放大;
- 完整流程如下图:
2. 识别QRCode
识别 QRCode ,可以使用 objdetect 模块下的 QRCodeDetector 类,选板如图。
实现过程分为两步:检测(detect)与解码(decode)。为了方便快捷,OpenCV还提供二合一的函数:detectAndDecode。
2.1 识别单一QRCode
- 一次简单的识别流程:new - detect - decode - delete;
- detect 返回 isDetected 为True时,代表检测成功,points 数组将包含二维码四个角点的坐标;
- decode 需要输入原图像和角点坐标,解码后返回字符串结果 decoded_string ;
- 完整流程 + 可视化,如下图所示。(您还可以使用 detectAndDecode 函数,将detect与decode合二为一)
2.2 识别多个QRCode
- 实现流程与上文类似,只不过检测与解码的函数,要换成后缀为 “Multi” 的,才能识别多个二维码;
- 多识别模式下,points 数组将包含多个二维码的角点,相邻4个点为一组;
- 完整流程 + 可视化,如下图所示。(本例使用二合一的 detectAndDecodeMulti 函数)
2.3 其他API
- decodeCurved 和 detectAndDecodeCurved 用于识别曲面二维码;
- setEpsX 和 setEpsY 可以自定义水平和垂直方向的扫描步长;
- setUseAlignmentMarkers 使用标记物来协助定位二维码角点;
条形码(Barcode)
目前 OpenCV 没有生成 Barcode 的 API,只有识别的 API。
1. 识别Barcode
识别 Barcode ,可以使用 objdetect 模块下的 BarcodeDetector 类,选板如图。
从选板中可以看出,条形码识别的函数,几乎与二维码识别的互为孪生,用法功能也是类似的,下文不再赘述。
1.1 识别单一Barcode
- 识别条形码的流程与二维码类似:new - detect - decode - delete;
- BarcodeDetector 类的 new.vi 是个多态VI,除了默认的default外,还有with model模式可以载入自定义的模型;
- 条形码周围需要一定的留白空间,否则可能识别失败。
1.2 识别多个Barcode
1.3 其他API
- decodeWithType 和 detectAndDecodeWithType 可以返回条形码的类型(如 EAN_13 等),而且二者默认是 “Multi” 模式,即同时识别多个条形码。
总结
- 本系列博文作为LabVIEW工具包—OpenCV的教程,将以专栏的形式陆续发布和更新。
- 对工具包感兴趣的朋友,欢迎下载试用:秣厉科技 - LabVIEW工具包 - OpenCV
- 各位看官有什么想法、建议、吐槽、批评,或新奇的需求,也欢迎留言讨论。