如何从静态图像读取QR码
我知道您可以使用AVFoundation
使用设备的相机扫描QR码。 现在问题来了,我怎么能从一个静态的UIImage
对象呢?
核心图像具有CIDetector
类,用于检测QR码的CIDetectorTypeQRCode
。 您可以提供静态图像或video的核心图像filter。
这应该符合你的需求。 有关更多信息,请参阅Xcode文档。
来自ShinobiControls的Github回购iOS8包括一个项目LiveDetection,展示了如何使用来自video源和静止图像的CIDetectorTypeQRCode。 它看起来像没有更新Swift 2.0,我无法得到它在Xcode 7.2.1下编译,但项目中的performQRCodeDetection
函数编译。 (编译问题是用处理所有可怕的types转换的代码来处理Swift中的CVPixelBuffers
,如果你想要做的就是在静态图像中查找QRCodes,这并不重要。
编辑:
这是从该网站的关键方法(在斯威夫特)
func performQRCodeDetection(image: CIImage) -> (outImage: CIImage?, decode: String) { var resultImage: CIImage? var decode = "" if let detector = detector { let features = detector.featuresInImage(image) for feature in features as! [CIQRCodeFeature] { resultImage = drawHighlightOverlayForPoints(image, topLeft: feature.topLeft, topRight: feature.topRight, bottomLeft: feature.bottomLeft, bottomRight: feature.bottomRight) decode = feature.messageString } } return (resultImage, decode) }
iOS API从CoreImage框架提供CIDetector类。 CIDetector可让您在图像中find特定的图案,如脸部,笑脸,眼睛或QRCode。
这里是Objective-C中从UIImage中检测QRCode的代码:
-(NSArray *)detectQRCode:(UIImage *) image { @autoreleasepool { NSLog(@"%@ :: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); NSCAssert(image != nil, @"**Assertion Error** detectQRCode : image is nil"); CIImage* ciImage = UIImage.CIImage; // assuming underlying data is a CIImage //CIImage* ciImage = [CIImage initWithCGImage: UIImage.CGImage]; // to use if the underlying data is a CGImage NSDictionary* options; CIContext* context = [CIContext context]; options = @{ CIDetectorAccuracy : CIDetectorAccuracyHigh }; // Slow but thorough //options = @{ CIDetectorAccuracy : CIDetectorAccuracyLow}; // Fast but superficial CIDetector* qrDetector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:options]; if ([[ciImage properties] valueForKey:(NSString*) kCGImagePropertyOrientation] == nil) { options = @{ CIDetectorImageOrientation : @1}; } else { options = @{ CIDetectorImageOrientation : [[ciImage properties] valueForKey:(NSString*) kCGImagePropertyOrientation]}; } NSArray * features = [qrDetector featuresInImage:ciImage options:options]; return features; } }
如果QRCode存在并检测到,则返回的NSArray*
将包含CIFeature*
。 如果没有QRCode, NSArray*
将是nil
。 如果QRCode解码失败, NSArray*
将没有元素。
获取编码的string:
if (features != nil && features.count > 0) { for (CIQRCodeFeature* qrFeature in features) { NSLog(@"QRFeature.messageString : %@ ", qrFeature.messageString); } }
就像@ Duncan-C的答案一样,你可以提取QRCode的angular点,并在图像上绘制QRCode的封闭边界框。
注意:在iOS10.0 beta6下,当使用来自cameraSampleBuffer的图像时,调用[qrDetector featuresInImage:ciImage options:options]
logging了这个内部警告(它运行平稳,但是用这个消息给控制台发送了垃圾邮件,我找不到现在摆脱它的方式):
locking计数为1时结束CVPixelBuffer 0x170133e20。
资源 :
Apple Dev API参考 – CIDetector
Apple Dev API编程指南 – 人脸检测
使用Zbar SDK从静态图像读取QR码 。
zbar和-SDK-IOS
请查看本教程关于Zbar SDK的整合。
ZBar SDK集成教程
然后尝试扫描静态图像。
使用Zbar扫描仪类来扫描您的图像。
这里是文档。
ZBarImageScanner。
举个例子,如何使用Zbar扫描仪类,
ZBarImageScanner *scandoc = [[ZBarImageScanner alloc]init]; NSInteger resultsnumber = [scandoc scanImage:yourUIImage]; if(resultsnumber > 0){ ZBarSymbolSet *results = scandoc.results; //Here you will get result. }
下面的链接将帮助你。
scaning-静态的UIImage -使用- IOS-zbar和-SDK