콘솔로 이동

iOS에서 ML Kit를 사용하여 바코드 읽기

ML Kit를 사용하여 바코드를 인식하고 디코딩할 수 있습니다.

시작하기 전에

  1. (EAP) CPDC EAP 사이트에 표시된 명령어를 실행하여 Git에 대한 쿠키를 인증하고 가져옵니다.
  2. (EAP) 프로젝트의 Podfile에 EAP 저장소를 추가합니다.
    source ‘https://cpdc-eap.googlesource.com/spec.git’
  3. iOS 프로젝트에 Firebase 추가의 단계를 완료합니다. Podfile에 코어 라이브러리 외에 ML Kit 라이브러리도 추가합니다.
    pod 'FirebaseML'
  4. (EAP) 앱에서 FirebaseML 모듈을 가져옵니다.

    Swift

    import FirebaseML

    Objective-C

    @import FirebaseML;

바코드 감지기 구성

읽으려는 바코드 형식을 알고 있는 경우, 해당 형식만 감지하도록 구성하여 바코드 감지기의 속도를 높일 수 있습니다.

Swift

예를 들어 Aztec 코드와 QR 코드만 감지하려면 VisionBarcodeDetectorOptions 객체를 다음과 같이 빌드합니다.

let options = VisionBarcodeDetectorOptions()
options.formats = .QRCode | .Aztec

지원되는 형식은 다음과 같습니다.

  • Code128
  • Code39
  • Code93
  • CodaBar
  • EAN13
  • EAN8
  • ITF
  • UPC_A
  • UPCE
  • DataMatrix
  • QRCode
  • PDF417
  • Aztec

Objective-C

예를 들어 Aztec 코드와 QR 코드만 감지하려면 FIRVisionBarcodeDetectorOptions 객체를 다음과 같이 빌드합니다.

FIRVisionBarcodeDetectorOptions *options = [[FIRVisionBarcodeDetectorOptions alloc] init];
options.formats = FIRVisionBarcodeFormatQRCode | FIRVisionBarcodeFormatAztec;

지원되는 형식은 다음과 같습니다.

  • Code 128(FIRVisionBarcodeFormatCode128)
  • Code 39(FIRVisionBarcodeFormatCode39)
  • Code 93(FIRVisionBarcodeFormatCode93)
  • Codabar(FIRVisionBarcodeFormatCodaBar)
  • EAN-13(FIRVisionBarcodeFormatEAN13)
  • EAN-8(FIRVisionBarcodeFormatEAN8)
  • ITF(FIRVisionBarcodeFormatITF)
  • UPC-A(FIRVisionBarcodeFormatUPCA)
  • UPC-E(FIRVisionBarcodeFormatUPCE)
  • Data Matrix(FIRVisionBarcodeFormatDataMatrix)
  • QR Code(FIRVisionBarcodeFormatQRCode)
  • PDF417(FIRVisionBarcodeFormatPDF417)
  • Aztec(FIRVisionBarcodeFormatAztec)

바코드 감지기 실행

이미지 속 바코드를 읽으려면 이미지를 CMSampleBufferRefVisionBarcodeDetectordetect(buffer:metadata:) 메소드에 전달하거나 이미지를 UIImagedetect(image:metadata:) 메소드에 전달합니다.

  1. VisionBarcodeDetector의 인스턴스를 가져옵니다.

    Swift

    do {
      let barcodeDetector = try FirebaseMachineLearning.machineLearning().barcodeDetector()
    } catch let error as NSError {
      print("Error: \(error)")
    }
    

    Objective-C

    NSError *error;
    FIRMachineLearning *machineLearning = [FIRMachineLearning machineLearning];
    FIRVisionBarcodeDetector *barcodeDetector = [machineLearning barcodeDetectorWithError:&error];
    
    if (error != nil) {
      NSLog(@"Barcode detector creation error: %@", error.localizedDescription);
    }
    
  2. 이미지 방향이 왼쪽 상단의 첫 번째 행 및 열에 맞지 않으면 VisionImageMetadata 객체를 만들어 이미지의 방향을 지정합니다.

    Swift

    let metadata = VisionImageMetadata()
    metadata.orientation = VisionDetectorImageOrientation.topRight
    

    Objective-C

    FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
    metadata.orientation = FIRVisionDetectorImageOrientationTopRight;
    
    이미지 방향이 왼쪽 상단의 첫 번째 행 및 열에 맞으면 메타데이터 객체 대신 nil을 전달할 수 있습니다.
  3. 그런 다음 이미지를 detect(buffer:metadata:) 또는 detect(image:metadata:) 메소드에 전달합니다.

    Swift

    do {
      barcodes = try barcodeDetector.detect(buffer: buffer!, metadata: nil)  // or detect(image:...)
    } catch let error as NSError {
      print("Error: \(error)")
    }
    

    Objective-C

    NSError *barcodeDetectError = nil;
    NSArray *barcodes =
        [barcodeDetector detectInBuffer:buffer  // or detectInImage:...
                               metadata:nil
                                  error:&error];
    if (error != nil) {
      NSLog(@"Barcode detection error: %@", error.localizedDescription);
      return 0;
    }
    

바코드에서 정보 가져오기

바코드 인식 작업이 성공하면 감지기는 VisionBarcodeFeature 객체의 배열을 반환합니다. 각 VisionBarcodeFeature 객체는 이미지에서 감지된 바코드를 나타냅니다. 바코드별로 입력 이미지의 경계 좌표 및 바코드로 인코딩된 원시 데이터를 가져올 수 있습니다. 또한 바코드 감지기가 바코드로 인코딩된 데이터 유형을 결정할 수 있는 경우, 파싱된 데이터가 포함된 객체를 가져올 수 있습니다.

예를 들면 다음과 같습니다.

Swift

for barcode in barcodes {
  let corners = barcode.cornerPoints

  let displayValue = barcode.displayValue
  let rawValue = barcode.rawValue

  let valueType = barcode.valueType
  switch valueType {
    case .WiFi:
      let ssid = barcode.wifi.ssid
      let password = barcode.wifi.password
      let encryptionType = barcode.wifi.type
    case .URLBookmark:
      let title = barcode.URL.title
      let url = barcode.URL.url
    default:
      // See API reference for all supported value types
  }
}

Objective-C

for (id barcode in barcodes) {
  NSArray corners = barcode.cornerPoints;

  NSString *displayValue = barcode.displayValue;
  NSString *rawValue = barcode.rawValue;

  FIRVisionBarcodeValueType valueType = barcode.valueType;
  switch (valueType) {
    case FIRVisionBarcodeValueTypeWiFi:
      NSString *ssid = barcode.wifi.ssid;
      NSString *password = barcode.wifi.password;
      FIRVisionBarcodeFeatureWiFiEncryptionType encryptionType = barcode.wifi.type;
      break;
    case FIRVisionBarcodeValueTypeURL:
      NSString *url = barcode.URL.url;
      NSString *title = barcode.URL.title;
      break;
  }
}