iOS 人脸检测

能检测出坐标,不能生成特征值。

1,人脸检测 AVCaptureMetadataOutput
AVMetadataFaceObject
2,CIDetector
CIFaceFuture

难点:
坐标系转化

1,将识别出来的脸部区域,转化为uikit正确坐标
AVCaputureVideoPreviewLayer rectForMetadataOutputRect 方法可以转换
AVMetadataFaceObject bounds 转化为相对AVCaputureVideoPreviewLayer上的rect
2,

    func detect() {
        let image = CIImage(image: imageView.image!)
        let options = [CIDetectorAccuracy:CIDetectorAccuracyHigh]
        let detector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: options)
        detector?.features(in: image!, options: nil).forEach({ (s) in
            let t = s as! CIFaceFeature
            let v = UIView(frame: converFrame(faceCoreImageFrame: t.bounds, imageCoreImageSize: image!.extent.size, imageViewUIKitFrame: imageView.frame))
            self.imageView.addSubview(v)
            v.layer.borderColor = UIColor.red.cgColor
            v.layer.borderWidth = 1
            v.layer.backgroundColor = UIColor.clear.cgColor
            
            if t.hasSmile {
                print("笑了")
            }
            if t.hasRightEyePosition {
                print("右边眼睛打开的")
            }
            if t.hasLeftEyePosition {
                print("左边眼睛打开的")
            }
        })
    }
func converFrame(faceCoreImageFrame:CGRect, imageCoreImageSize:CGSize, imageViewUIKitFrame:CGRect) -> CGRect {
        var transform = CGAffineTransform.identity
        transform = transform.scaledBy(x: 1, y: -1)
        transform = transform.translatedBy(x: 0, y: -imageCoreImageSize.height)
        var faceUIKitFrame = faceCoreImageFrame.applying(transform)
        
        let viewSize = imageViewUIKitFrame.size
        let scale = min(viewSize.width / imageCoreImageSize.width,
                        viewSize.height / imageCoreImageSize.height)
        let offsetX = (viewSize.width - imageCoreImageSize.width * scale) / 2
        let offsetY = (viewSize.height - imageCoreImageSize.height * scale) / 2
        
        
        faceUIKitFrame = faceUIKitFrame.applying(CGAffineTransform.identity.scaledBy(x: scale, y: scale))
        
 
        faceUIKitFrame.origin.x += offsetX
        faceUIKitFrame.origin.y += offsetY

        return faceUIKitFrame
    }```




![AVCapture.jpg](http://upload-images.jianshu.io/upload_images/45726-36b9cac552ec9b86.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容