iOS根据相册图片识别条形码、二维码以及脸部特征

2021-09-13  本文已影响0人  WMSmile

iOS根据相册图片识别条形码、二维码以及脸部特征

首先介绍一下CIDetector,CIDetector 支持文本,二维码,脸部特征和图片文本的识别.

/* Specifies a detector type for face recognition. */
@available(iOS 5.0, *)
public let CIDetectorTypeFace: String

/* Specifies a detector type for rectangle detection. */
@available(iOS 8.0, *)
public let CIDetectorTypeRectangle: String

/* Specifies a detector type for barcode detection. */
@available(iOS 8.0, *)
public let CIDetectorTypeQRCode: String

/* Specifies a detector type for text detection. */

@available(iOS 9.0, *)
public let CIDetectorTypeText: String

原生识别二维码

    // 获取二维码
    func WM_FUNC_getQrCode(qrcodeImg:UIImage) -> Void {
        if let img:CIImage = CIImage.init(image: qrcodeImg) {
            if let qrDetector =  CIDetector.init(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])  {
                let reultFeature = qrDetector.features(in: img);
                for feature in reultFeature {
                    if feature.isKind(of: CIQRCodeFeature.self) {
                        let qrFeature:CIQRCodeFeature = feature as! CIQRCodeFeature
                        print("qrcode == \(qrFeature.messageString ?? "")")
                    }else{
                        print("not CIQRCodeFeature")
                    }
                }
            }else{
                print("CIDetector init error")
            }
        }else{
            print("CIImage init error")
        }
        
    }

原生识别脸部特征

    //获取脸部特征
    func WM_FUNC_getFace(_ image:UIImage) -> Void {
        let imageInput:UIImage = image;
        if let cgImage = imageInput.cgImage {
            let ciImage:CIImage = CIImage.init(cgImage: cgImage)
            let context:CIContext = CIContext.init(options: nil);
            let param:[String:Any] = [CIDetectorAccuracy:CIDetectorAccuracyHigh]
            if let faceDetector:CIDetector = CIDetector.init(ofType: CIDetectorTypeFace, context: context, options: param) {
                let detectResult = faceDetector.features(in: ciImage)
                //                let resultView:UIView = UIImageView.init(frame: imageInput.size);
                //                [self.view addSubview:resultView];
                
                for feature in detectResult {
                    if feature.isKind(of: CIFaceFeature.self){
                        let faceFeature:CIFaceFeature = feature as! CIFaceFeature;
                        //左眼
                        if (faceFeature.hasLeftEyePosition) {
                            //                            var leftEyeView:UIView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 5, height: 5));
                            //                            leftEyeView.center = faceFeature.leftEyePosition
                            //                            leftEyeView.layer.borderWidth = 1;
                            //                            leftEyeView.layer.borderColor = UIColor.red.cgColor;
                            ////                            [resultView addSubview:leftEyeView];
                        }
                        //右眼
                        else if (faceFeature.hasRightEyePosition) {

                        }
                        //嘴
                        else if (faceFeature.hasMouthPosition) {

                        }else{
                            //整个脸部的位置

                        }
                    }
                }
            }else{
                print("CIDetector init error")
            }
        }else{
            print("CIImage init error")
        }

    }

原生识别条形码

VNDetectBarcodesRequest 只要iOS11.0+以上支持,支持iOS11.0-以下请使用其他方案

    // Create a barcode detection-request
    let barcodeRequest = VNDetectBarcodesRequest(completionHandler: { request, error in
        guard let results = request.results else { return }
        // Loopm through the found results
        for result in results {
            
            // Cast the result to a barcode-observation
            if let barcode = result as? VNBarcodeObservation {
                
                // Print barcode-values
                print("Symbology: \(barcode.symbology.rawValue)")
                
                // Print barcode string
                if let payload = barcode.payloadStringValue {
                    print("Payload: \(payload)")
                }
                if let desc = barcode.barcodeDescriptor as? CIQRCodeDescriptor {
                    let content = String(data: desc.errorCorrectedPayload, encoding: .utf8)
                    // FIXME: This currently returns nil. I did not find any docs on how to encode the data properly so far.
                    print("Payload: \(String(describing: content))")
                    print("Error-Correction-Level: \(desc.errorCorrectionLevel)")
                    print("Symbol-Version: \(desc.symbolVersion)")
                }
            }
        }
    })
    
    
    // 获取条形码
    func WM_FUNC_getInfoByImage() -> Void {
        let myImage = UIImage.init(named: "1631511918532.jpg");
        // Create an image handler and use the CGImage your UIImage instance.
        guard let image = myImage?.cgImage else { return }
        let handler = VNImageRequestHandler(cgImage: image, options: [:])
        // Perform the barcode-request. This will call the completion-handler of the barcode-request.
        guard let _ = try? handler.perform([barcodeRequest]) else {
            return print("Could not perform barcode-request!")
        }
    }
上一篇下一篇

猜你喜欢

热点阅读