一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天 点击查看活动详情。
上一篇# 如何将 opencv_contrib 中的第三方库 打包到 opencv 中,并生成iOS用的framework 文章中,咱们已经将openvc.framework 打包好了,今天这篇就来看看如何去运用,微信开源的二维码扫描库。
ps : 本章主旨在如何在iOS端使用微信开源的二维码扫描库,其他的如何去UI布局一个扫描功能,这个就不说了。
step 1
新建一个文件 继承自NSObject ,就取名为 QCCodeWechatFind
修改其.m文件 为.mm (因为要写c++代码)
导入头文件
#include "opencv2/wechat_qrcode.hpp"
声明两个函数
为什么要声明单例呢?
因为微信扫描二维码的功能,要导入4个模型文件,为了只用操作一次,就将导入这些模型的功能,放入单例中实现
这段代码中 detector 是一个全局变量,所以 我们需要在外面进行一个声明
// 全局 detector 变量
cv::Ptr<wechat_qrcode::WeChatQRCode> detector;
step 2
咱们来实现
/// 传入imgRef 返回 扫描结果URL数组
-(NSMutableArray *)preprocessImg:(CGImageRef)img;
输入的是一个CGImageRef,输出的是 URL 数组(可以自己定义)
假设咱们通过扫描,拿到一张图片的CGImageRef(如何找到的 可以自己实现)
在这个函数里,要先将 CGImageRef 转为 Mat对象,不然opencv库是不认识的。
转换函数:
然后要初始化两个容器,一个装 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个模型文件 链接,放入文件夹即可。