CIDetector
是Core Image
框架中提供的一个识别类,包括对人脸、形状、条码、文本的识别,本文主要介绍人脸特征识别。
CIDetector:
1、+ (nullable CIDetector *)detectorOfType:(NSString*)type
context:(nullable CIContext *)context
options:(nullable NSDictionary<NSString *,id> *)options NS_AVAILABLE(10_7, 5_0);
参数:1)type可传四个值,分别对应人脸、形状、条码、文本:
NSString* const CIDetectorTypeFace NS_AVAILABLE(10_7, 5_0);
NSString* const CIDetectorTypeRectangle NS_AVAILABLE(10_10, 8_0);
NSString* const CIDetectorTypeQRCode NS_AVAILABLE(10_10, 8_0);
NSString* const CIDetectorTypeText NS_AVAILABLE(10_11, 9_0);
2)context:图形上下文
3)options:传入一个字典,key value对应如下:
CIDetectorAccuracy:CIDetectorAccuracyLow (低精度、速度快)和 CIDetectorAccuracyHigh(高精度、速度慢)
CIDetectorTracking:指定使用特征跟踪,这个功能就像相机中的人脸跟踪功能。
CIDetectorMinFeatureSize:用于设置将要识别的特征的最小尺寸,也就是说小于这个尺寸的特征将不识别。
@ 对于人脸检测器,取值0.0 ~ 1.0
的NSNumber
值,表示:基于输入图像短边长度的百分比。有效值范围:0.01 <= CIDetectorMinFeatureSize <= 0.5
。为这个参数设定更高值仅用于提高性能。默认值是0.15
。
@ 对于矩形探测器,取值0.0 ~ 1.0
的NSNumber
值,表示:基于输入图像短边长度的百分比。有效值范围:0.2 <= CIDetectorMinFeatureSize <= 1.0
的默认值是0.2
。
@ 对于文本探测器,取值0.0 ~ 1.0
的NSNumber
值,表示:基于输入图像高度的百分比。有效值范围:0.0 <= CIDetectorMinFeatureSize <= 1.0
。默认值是10/(输入图像的高度)
。
CIDetectorMaxFeatureCount:是针对矩形探测器的,用于设置返回矩形特征的最多个数。这个关键字的值是一个1~...
的NSNumber
值。有效范围1 < = CIDetectorMaxFeatureCount < = 256
。默认值为1
。
CIDetectorNumberOfAngles:设置角度的个数,值是1、3、5、7、9、11
中的一个值
CIDetectorImageOrientation:用于设置识别方向,值是一个从1 ~ 8
的整型的NSNumber
。如果值存在,检测将会基于这个方向进行,但返回的特征仍然是基于这些图像的
CIDetectorEyeBlink:如果设置这个参数为true
(bool类型的NSNumber),识别器将提取眨眼特征。
CIDetectorSmile:如果设置这个参数为ture
(bool类型的NSNumber),识别器将提取微笑特征。
CIDetectorFocalLength:用于设置每帧焦距,值得类型为floot类型
的NSNumber
。
CIDetectorAspectRatio:用于设置矩形的长宽比,值得类型为floot类型
的NSNumber
。
CIDetectorReturnSubFeatures:控制文本检测器是否应该检测子特征。默认值是否,值的类型为bool类型
的NSNumber
。
以下两个方法返回图片特征CIFeature:
2、- (NSArray<CIFeature *> *)featuresInImage:(CIImage *)image NS_AVAILABLE(10_7, 5_0);
3、- (NSArray<CIFeature *> *)featuresInImage:(CIImage *)image
options:(nullable NSDictionary<NSString *,id> *)options NS_AVAILABLE(10_8, 5_0);
@property (readonly, retain) NSString *type; // 类型
@property (readonly, assign) CGRect bounds; // 大小
四个子类,具不详述:
CIFaceFeature
CIRectangleFeature
CIQRCodeFeature
CITextFeature
关键注意最后一句。
注意:CIFaceFeature中的bounds的Y值 是距离底部的值。所以设置红方框的frame的Y应该是父view的height 减去 feature的bounds的Y - feature的bounds的Height,才是你需要的Y值。
UIImage * imageInput = [_inputImgView image];
CIImage * image = [CIImage imageWithCGImage:imageInput.CGImage];
CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil
options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
NSArray *detectResult = [faceDetector featuresInImage:image];
UIView *resultView = [[UIView alloc] initWithFrame:_inputImgView.frame];
resultView.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:0.3];
[self.view addSubview:resultView];
for (CIFaceFeature * faceFeature in detectResult) {
UIView *faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];
faceView.layer.borderColor = [UIColor redColor].CGColor;
faceView.layer.borderWidth = 1;
[resultView addSubview:faceView];
}
[resultView setTransform:CGAffineTransformMakeScale(1, -1)];
参考:https://www.jianshu.com/p/ae480461bcc5
-- NORMAL --
-- NORMAL --