12/08/2018, 15:25

Nhận diện khuôn mặt dùng Core Image

Xây dựng ứng dụng nhận diện khuôn mặt đơn giản sử dụng Core Image Bắt đầu Project, các bạn hãy download starter project tại đây Tiếp theo viết phương thức để nhận ra đâu là khuôn mặt ` func detect() { guard let personciImage = CIImage(image: personPic.image!) else { return } let accuracy = ...

Xây dựng ứng dụng nhận diện khuôn mặt đơn giản sử dụng Core Image Bắt đầu Project, các bạn hãy download starter project tại đây Tiếp theo viết phương thức để nhận ra đâu là khuôn mặt ` func detect() {

guard let personciImage = CIImage(image: personPic.image!) else {
    return
}

let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy)
let faces = faceDetector.featuresInImage(personciImage)

for face in faces as! [CIFaceFeature] {
    
    print("Found bounds are (face.bounds)")
    
    let faceBox = UIView(frame: face.bounds)

    faceBox.layer.borderWidth = 3
    faceBox.layer.borderColor = UIColor.redColor().CGColor
    faceBox.backgroundColor = UIColor.clearColor()
    personPic.addSubview(faceBox)
    
    if face.hasLeftEyePosition {
        print("Left eye bounds are (face.leftEyePosition)")
    }
    
    if face.hasRightEyePosition {
        print("Right eye bounds are (face.rightEyePosition)")
    }
}

}` tiếp theo ta chạy project và sẽ đc kết quả như sau và ở console output sẽ hiển thị vị trí

Found bounds are (177.0, 415.0, 380.0, 380.0)

Rồi thay thế phương thức detect đó bằng đoạn code sau

func detect() {
        
        guard let personciImage = CIImage(image: personPic.image!) else {
            return
        }
        
        let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
        let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy)
        let faces = faceDetector?.features(in: personciImage)
        
        // Convert Core Image Coordinate to UIView Coordinate
        let ciImageSize = personciImage.extent.size
        var transform = CGAffineTransform(scaleX: 1, y: -1)
        transform = transform.translatedBy(x: 0, y: -ciImageSize.height)
        
        for face in faces as! [CIFaceFeature] {
            
            print("Found bounds are (face.bounds)")
            
            // Apply the transform to convert the coordinates
            var faceViewBounds = face.bounds.applying(transform)
            
            // Calculate the actual position and size of the rectangle in the image view
            let viewSize = personPic.bounds.size
            let scale = min(viewSize.awidth / ciImageSize.awidth,
                            viewSize.height / ciImageSize.height)
            let offsetX = (viewSize.awidth - ciImageSize.awidth * scale) / 2
            let offsetY = (viewSize.height - ciImageSize.height * scale) / 2
            
            faceViewBounds = faceViewBounds.applying(CGAffineTransform(scaleX: scale, y: scale))
            faceViewBounds.origin.x += offsetX
            faceViewBounds.origin.y += offsetY
            
            let faceBox = UIView(frame: faceViewBounds)
            
            faceBox.layer.borderWidth = 3
            faceBox.layer.borderColor = UIColor.red.cgColor
            faceBox.backgroundColor = UIColor.clear
            personPic.addSubview(faceBox)
            
            if face.hasLeftEyePosition {
                print("Left eye bounds are (face.leftEyePosition)")
            }
            
            if face.hasRightEyePosition {
                print("Right eye bounds are (face.rightEyePosition)")
            }
        }
    }

rồi ta sẽ nhận được kết quả như sau

một bài tutorial đơn giản để các bạn có thể nhận diện khuôn mặt bằng chính Core Image. Từ ứng dụng đơn giản này các bạn có thể tuỳ biến để dùng với camera hay nhiều ứng dụng khác nữa

Bài viết có sử dụng hình ảnh cũng như nguồn từ APPCODA Peaceeeeee!

0