使用 coreimage 可以实现人脸识别功能,并且获取到人脸面部五官的位置。
CIContext *context = [[CIContext alloc]init];
CIImage *ciImage = [CIImage imageWithCGImage:_faceImg.CGImage];
NSDictionary *dic = [NSDictionary dictionaryWithObject:CIDetectorAccuracy forKey:CIDetectorAccuracyHigh];
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:dic];
NSArray *array = [detector featuresInImage:ciImage];
// 照片中只有一个人脸的人脸识别
if (array.count ==1) {
for (CIFaceFeature *feature in array) {
NSInteger leftEye_X = feature.leftEyePosition.x;
NSInteger leftEye_Y = feature.leftEyePosition.y;
NSInteger rightEye_X = feature.rightEyePosition.x;
NSInteger rightEye_Y = feature.rightEyePosition.y;
// NSInteger mouth_X = feature.mouthPosition.x;
NSInteger mouth_Y = feature.mouthPosition.y;
// 头为正 左眼高 右眼底 需逆时针旋转
if (leftEye_Y > rightEye_Y && leftEye_Y > mouth_Y && leftEye_X < rightEye_X)
{
CGFloat height = leftEye_Y - rightEye_Y;
CGFloat width = rightEye_X - leftEye_X;
CGFloat rad = atan(height/width);
self.transform = CGAffineTransformMakeRotation(-rad);
}else if (leftEye_Y < rightEye_Y && rightEye_Y > mouth_Y && leftEye_X < rightEye_X)
{
CGFloat height = rightEye_Y - leftEye_Y;
CGFloat width = rightEye_X - leftEye_X;
CGFloat rad = atan(height/width);
self.transform = CGAffineTransformMakeRotation(rad);
}else if (leftEye_X >= rightEye_X && leftEye_Y >= rightEye_Y && mouth_Y > leftEye_Y) {
CGFloat height = leftEye_Y - rightEye_Y;
CGFloat width = leftEye_X - rightEye_X;
CGFloat rad = atan(height/width);
self.transform = CGAffineTransformMakeRotation(-(M_PI-rad));
}else if (leftEye_X >= rightEye_X && rightEye_Y >= leftEye_Y && mouth_Y > leftEye_Y) {
CGFloat height = rightEye_Y - leftEye_Y;
CGFloat width = leftEye_X - rightEye_X;
CGFloat rad = atan(height/width);
self.transform = CGAffineTransformMakeRotation((M_PI - rad));
}else{
self.transform = CGAffineTransformMakeRotation(0);
}
}
// 照片中有多个人脸的人脸识别 给每个人脸打上马赛克
}else if (array.count > 1){
CGSize inputImageSize = ciImage.extent.size;
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformScale(transform, 1, -1);
transform = CGAffineTransformTranslate(transform, 0, -inputImageSize.height);