iOS二维码扫描

在iOS7之前,二维码扫描只能用第三库(ZBar、ZXing),我的项目中只用到过ZXing,他们的优劣大家自行百度吧。iOS7之后,苹果推出AVFoundation,在灵敏度和性能上完爆上面的那两个第三方库,就像JSON解析一样,性能上不是一个数量级的,苹果出品,必须经典。

其实在开发中,我们基本上只关心AVFoundation的AVCaptureSession。这个决定了视频输入每一帧图像质量的大小。

可以通过设置AVCaptureSession 的sessionPreset 属性来改变视频输入每一帧图像质量的大小。


另外还有参数AVCaptureSessionPreset320x240、AVCaptureSessionPreset352x288、AVCaptureSessionPreset640x480、AVCaptureSessionPreset960x540、AVCaptureSessionPreset1280x720、AVCaptureSessionPreset1920x1080

一般来说AVCaptureSessionPresetMedium或AVCaptureSessionPreset640x480就能玩转了。

但是、但是、但是、我们有个变态的项目,要识别印在手机卡上的条形码或者二维码,那个小啊,

我们测试说过,只要腾讯、阿里能实现的技术,我们必须实现。

当我拿着微信、QQ、支付宝扫描的时候,他们的识别度是10次能识别1-2次,跟我写的差不多。

当我在心中窃喜,想用他们都没实现,咱也不改了吧的时候,项目经理来了句,这个功能必须实现,我无语中。。。

没办法了,查找资料,还好翻到这篇博客http://blog.cnbluebox.com/blog/2014/08/26/ioser-wei-ma-sao-miao

那项目我们就来研究一下它AVCaptureMetadataOutput 的 rectOfInterest 属性

最开始我按照文档说的按照比例值来设置这个属性,如下:

CGSize size = self.view.bounds.size;

CGRect cropRect = CGRectMake(40, 100, 240, 240);

captureOutput.rectOfInterest = CGRectMake(cropRect.origin.x/size.width,

cropRect.origin.y/size.height,

cropRect.size.width/size.width,

cropRect.size.height/size.height);

但是发现, Ops, 好像不对啊,扫不到了,明显不正确呢,于是猜想: AVCapture输出的图片大小都是横着的,而iPhone的屏幕是竖着的,那么我把它旋转90°呢:

CGSize size = self.view.bounds.size;

CGRect cropRect = CGRectMake(40, 100, 240, 240);

captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,

cropRect.origin.x/size.width,

cropRect.size.height/size.height,

cropRect.size.width/size.width);

OK,貌似对了,在iPhone5上一切工作良好,但是在4s上,或者换了sessionPreset的大小之后,这个框貌似就不那么准确了, 可能发现超出框上下一些也是可以扫描出来的。 再次猜想: 图片的长宽比和手机屏幕不是一样的,这个rectOfInterest是相对于图片大小的比例。比如iPhone4s屏幕大小是 640x960, 而图片输出大小是 1920x1080. 实际的情况可能就是下图中的效果:

上图中下面的代表iPhone4s屏幕,大小640x960, 上面代表AVCaptureVideoPreviewLayer中预览到的图片位置,在图片输入为1920x1080大小时,实际大小上下会被截取一点的,因为我们AVCaptureVideoPreviewLayer设置的videoGravity是AVLayerVideoGravityResizeAspectFill, 类似于UIView的UIViewContentModeScaleAspectFill效果。

于是我对大小做了一下修正:

CGSize size = self.view.bounds.size;

CGRect cropRect = CGRectMake(40, 100, 240, 240);

CGFloat p1 = size.height/size.width;

CGFloat p2 = 1920./1080.;  //使用了1080p的图像输出

if (p1 < p2) {

CGFloat fixHeight = bounds.size.width * 1920. / 1080.;

CGFloat fixPadding = (fixHeight - size.height)/2;

captureOutput.rectOfInterest = CGRectMake((cropRect.origin.y + fixPadding)/fixHeight,

cropRect.origin.x/size.width,

cropRect.size.height/fixHeight,

cropRect.size.width/size.width);

} else {

CGFloat fixWidth = bounds.size.height * 1080. / 1920.;

CGFloat fixPadding = (fixWidth - size.width)/2;

captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,

(cropRect.origin.x + fixPadding)/fixWidth,

cropRect.size.height/size.height,

cropRect.size.width/fixWidth);

}

经过上面的验证,证实了猜想rectOfInterest是基于图像的大小裁剪的。

参考文献::http://blog.cnbluebox.com/blog/2014/08/26/ioser-wei-ma-sao-miao/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容