能检测出坐标,不能生成特征值。
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)