iOS CoreImage框架(三)—— CIDetector(检测)和CIFeature(特征)【CIDetector人脸识别bounds不对?】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HDFQQ188816190/article/details/82910785

CIDetectorCore Image框架中提供的一个识别类,包括对人脸、形状、条码、文本的识别,本文主要介绍人脸特征识别。

一、API介绍

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.0NSNumber值,表示:基于输入图像短边长度的百分比。有效值范围:0.01 <= CIDetectorMinFeatureSize <= 0.5。为这个参数设定更高值仅用于提高性能。默认值是0.15
@ 对于矩形探测器,取值0.0 ~ 1.0NSNumber值,表示:基于输入图像短边长度的百分比。有效值范围:0.2 <= CIDetectorMinFeatureSize <= 1.0的默认值是0.2
@ 对于文本探测器,取值0.0 ~ 1.0NSNumber值,表示:基于输入图像高度的百分比。有效值范围: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);

 

CIFeature:

@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 --
展开阅读全文

没有更多推荐了,返回首页