[swift] Swift에서 카메라로 신분증 인식하기

이제는 SwiftiOS 앱을 개발할 때** 카메라로 신분증을 인식하는 기능을 추가할 수 있습니다. 이 기능을 구현하기 위해 **VisionCore ML 프레임워크를 사용할 수 있습니다.

아래에서는 신분증 인식을 위한 Swift 코드 예시를 제시해보겠습니다.

import UIKit
import Vision
import AVFoundation

class IDRecognitionViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    private var videoCapture: AVCaptureSession!
    private var videoOutput: AVCaptureVideoDataOutput!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        videoCapture = AVCaptureSession()
        
        guard let videoDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else { return }
        
        do {
            let videoInput = try AVCaptureDeviceInput(device: videoDevice)
            
            if videoCapture.canAddInput(videoInput) {
                videoCapture.addInput(videoInput)
            }
            
            videoOutput = AVCaptureVideoDataOutput()
            videoOutput.alwaysDiscardsLateVideoFrames = true
            videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
            
            if videoCapture.canAddOutput(videoOutput) {
                videoCapture.addOutput(videoOutput)
            }
            
            let videoLayer = AVCaptureVideoPreviewLayer(session: videoCapture)
            videoLayer.frame = view.layer.bounds
            view.layer.addSublayer(videoLayer)
            
            videoCapture.startRunning()
        } catch {
            print(error)
        }
    }

    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
        
        let request = VNDetectBarcodesRequest { request, error in
            guard error == nil else { return }
            
            guard let barcodes = request.results as? [VNBarcodeObservation] else { return }
            
            for barcode in barcodes {
                if let payload = barcode.payloadStringValue {
                    print(payload)
                }
            }
        }
        
        try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
    }
}

위의 코드에서는 AVCaptureSession을 사용하여 카메라 입력을 설정하고, AVCaptureVideoDataOutput 을 사용하여 비디오 데이터를 받아옵니다.

그 후 Vision 프레임워크를 사용하여 신분증을 탐지하고 Core ML 모델을 활용하여 정보를 추출합니다.

신분증의 바코드OCR을 사용하여 정보를 추출할 수 있으며, 필요에 따라 해당 정보를 처리하고 UI에서 표시할 수 있습니다.

카메라로부터 영상 데이터를 받아오는 것에서부터 바코드 및 텍스트 인식에 이르기까지 이 기능을 구현하는데 사용할 수 있는 다양한 방법이 있습니다.


참고 자료:

  1. Apple Developer Documentation - Vision
  2. Apple Developer Documentation - Core ML