如何在iOS项目中使用微信开源的二维码扫描库

1,520 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天 点击查看活动详情

上一篇# 如何将 opencv_contrib 中的第三方库 打包到 opencv 中,并生成iOS用的framework 文章中,咱们已经将openvc.framework 打包好了,今天这篇就来看看如何去运用,微信开源的二维码扫描库。

ps : 本章主旨在如何在iOS端使用微信开源的二维码扫描库,其他的如何去UI布局一个扫描功能,这个就不说了。


step 1

新建一个文件 继承自NSObject ,就取名为 QCCodeWechatFind

修改其.m文件 为.mm (因为要写c++代码)

导入头文件 #include "opencv2/wechat_qrcode.hpp"

声明两个函数

截屏2022-04-29 下午4.29.41.png

为什么要声明单例呢?

因为微信扫描二维码的功能,要导入4个模型文件,为了只用操作一次,就将导入这些模型的功能,放入单例中实现

截屏2022-04-29 下午4.31.03.png

截屏2022-04-29 下午4.32.00.png

这段代码中 detector 是一个全局变量,所以 我们需要在外面进行一个声明

// 全局 detector 变量
cv::Ptr<wechat_qrcode::WeChatQRCode> detector;

step 2

咱们来实现

/// 传入imgRef 返回 扫描结果URL数组
-(NSMutableArray *)preprocessImg:(CGImageRef)img;

输入的是一个CGImageRef,输出的是 URL 数组(可以自己定义)

假设咱们通过扫描,拿到一张图片的CGImageRef(如何找到的 可以自己实现)

截屏2022-04-29 下午4.32.58.png

在这个函数里,要先将 CGImageRef 转为 Mat对象,不然opencv库是不认识的。

转换函数:

截屏2022-04-29 下午4.34.31.png

然后要初始化两个容器,一个装 string 类型的 url(相当于一个数组),一个装Mat类型的point(用于描绘二维码在哪的)。

为什么要用容器装呢?因为扫描出来的不一定只有一个,可能有多个。

接下来使用微信扫码库提供的方法,传入图片的 Mat ,就会得到url信息。

strDecoded = detector->detectAndDecode(srcImg, points);

(ps 这里 points,也是返回对象,可以传出去使用,但是我这边没有用到,就算了。)

最后,咱们处理一下数据就可以传出去了

if (strDecoded.size() > 0){
        for (int i = 0; i < strDecoded.size(); i++)
          {
              string strUrl = strDecoded[i];
              NSString *url = [NSString stringWithCString:strUrl.c_str()
                                                 encoding:[NSString defaultCStringEncoding]];
              [urlArr addObject:url];
          }
    }
    return urlArr;

注意点

1 使用微信扫描需要导入4个模型文件 链接,放入文件夹即可。