【问题标题】:CIDetector not detecting QRCodesCIDetector 未检测到二维码
【发布时间】:2016-01-24 20:33:35
【问题描述】:

我正在尝试使用 CIDetector 从 UIImage 中检测 QRCode,以便从中提取 messageString

我有一个函数,它基本上接收 UIImage 作为输入并返回解码后的 messageString

我传递给此函数的 UIImage 是使用 PHAsset、PHAssetCollection、PHImageRequestOptions 等从用户库中提取的。请求是同步发出的,我得到的所有图像质量都很好(我试图展示图像在 UIImageView 中只是为了确保图像可读)。

在这里您可以看到请求图像的代码的 sn-p:

let _: PHImageRequestID = PHImageManager.defaultManager().requestImageForAsset(asset as! PHAsset, targetSize: size, contentMode: PHImageContentMode.AspectFit, options: options, resultHandler: { (image: UIImage?, info:[NSObject : AnyObject]?) -> Void in
                    images.append(image!)
                })

获取图像后,我想检测二维码,我正在使用以下代码:

func scanImage(image: CIImage) -> String {

    let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])
    var image = CIImage(image: uiimage)

    var decode = ""
    let features = detector.featuresInImage(image!)
    for feature in features as! [CIQRCodeFeature] {
        decode = feature.messageString
    }
    return decode
}

我发现了这个 (Core Image Detector(CIDetector) is not detecting QRCodes) 和其他类似的问题,但它们似乎都不起作用。

这是我遵循的教程https://www.shinobicontrols.com/blog/ios8-day-by-day-day-13-coreimage-detectors

我是不是做错了什么?

提前致谢

【问题讨论】:

    标签: ios swift uiimage ios9 qr-code


    【解决方案1】:

    问题是您在函数中传递 CIImage

    func scanImage(image: CIImage)
    

    然后在

    中添加另一个带有未定义图像的图像变量
    var image = CIImage(image: uiimage)
    

    去掉这行应该没问题 我正在为自己写一个二维码,如果你有兴趣,可以看看。

    // open photo library 
    func loadGallery() {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .PhotoLibrary
        self.presentViewController(imagePicker,
            animated: true,
            completion: nil)
    }
    
    // read QRCode from selecting image
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        let qrImg:UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    
        if #available(iOS 8.0, *) {
            let detector:CIDetector = CIDetector(ofType: CIDetectorTypeQRCode, context:nil, options:[CIDetectorAccuracy: CIDetectorAccuracyHigh])
            let ciimg: CIImage = CIImage(image: qrImg)!
            let features = detector.featuresInImage(ciimg)
    
            for feature in features as! [CIQRCodeFeature] {
                print(feature.messageString)
            }
    
    
        } else {
            // Fallback on earlier versions
        }
    
        dismissViewControllerAnimated(true, completion: nil)
    }
    

    更新到 Swift 3 xcode 8.1

    // read QRCode from selecting image
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    
    
        let qrImg:UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    
        if #available(iOS 8.0, *) {
            let detector:CIDetector = CIDetector(ofType: CIDetectorTypeQRCode, context:nil, options:[CIDetectorAccuracy: CIDetectorAccuracyHigh])!
            let ciimg: CIImage = CIImage(image: qrImg)!
            let features = detector.features(in: ciimg)
    
            for feature in features as! [CIQRCodeFeature] {
                print(feature.messageString!)
            }
    
    
        } else {
            // Fallback on earlier versions
        }
        dismiss(animated: true, completion: nil)
    }
    

    希望对你有帮助

    【讨论】:

    • ...我已经测试了上面的代码.....features 对象返回一个大小为 0 的数组.....我错过了什么吗?
    • 我检查了代码并将其更新为较新版本的 swift,它在我的项目中运行良好。看看这篇文章也许这会有所帮助http://stackoverflow.com
    • 我还得到了一个大小为 0 的数组。将上面的代码更改为 CIDetector.init(...) 而不是 CIDetector(...) 解决了问题,现在 CIDetector 读取 QRCodes 就好了。
    猜你喜欢
    • 2016-02-14
    • 2018-02-06
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多