前言
CIDetector
是Core Image
框架中提供的一個(gè)識(shí)別類任柜,包括對人臉、形狀沛厨、條碼宙地、文本的識(shí)別,本文主要介紹人臉特征識(shí)別逆皮。
人臉識(shí)別功能不單單可以對人臉進(jìn)行獲取宅粥,還可以獲取眼睛和嘴等面部特征信息。但是CIDetector
不包括面紋編碼提取电谣,也就是說CIDetector
只能判斷是不是人臉粹胯,而不能判斷這張人臉是誰的,比如說面部打卡這種功能是實(shí)現(xiàn)不了的辰企。
創(chuàng)建
// 創(chuàng)建圖形上下文
CIContext * context = [CIContext contextWithOptions:nil];
// 創(chuàng)建自定義參數(shù)字典
NSDictionary * param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
// 創(chuàng)建識(shí)別器對象
CIDetector * faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:param];
我們先來看看識(shí)別器的類型都有哪些,這里我們設(shè)置的是CIDetectorTypeFace
况鸣,人臉識(shí)別探測器類型牢贸。
// 人臉識(shí)別探測器類型
CORE_IMAGE_EXPORT NSString* const CIDetectorTypeFace NS_AVAILABLE(10_7, 5_0);
// 矩形檢測探測器類型
CORE_IMAGE_EXPORT NSString* const CIDetectorTypeRectangle NS_AVAILABLE(10_10, 8_0);
// 條碼檢測探測器類型
CORE_IMAGE_EXPORT NSString* const CIDetectorTypeQRCode NS_AVAILABLE(10_10, 8_0);
// 文本檢測探測器類型
#if __OBJC2__
CORE_IMAGE_EXPORT NSString* const CIDetectorTypeText NS_AVAILABLE(10_11, 9_0);
#endif
參數(shù)設(shè)置
說完識(shí)別器的類型我們再來看看,識(shí)別器的參數(shù)設(shè)置镐捧。識(shí)別器參數(shù)的設(shè)置是以一個(gè)字典形式的參數(shù)傳入的潜索。這里的NSDictionary * param
就是我們要設(shè)置的參數(shù)字典。
- 我們這里設(shè)置了一個(gè)識(shí)別精度
CIDetectorAccuracy
懂酱,識(shí)別精度的值有:
// 識(shí)別精度低竹习,但識(shí)別速度快、性能高
CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyLow NS_AVAILABLE(10_7, 5_0);
// 識(shí)別精度高列牺,但識(shí)別速度慢整陌、性能低
CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyHigh NS_AVAILABLE(10_7, 5_0);
- 除了精度的設(shè)置,還有
CIDetectorTracking
瞎领,指定使用特征跟蹤泌辫,這個(gè)功能就像相機(jī)中的人臉跟蹤功能。
CIDetectorMinFeatureSize
用于設(shè)置將要識(shí)別的特征的最小尺寸九默,也就是說小于這個(gè)尺寸的特征將不識(shí)別震放。
@ 對于人臉檢測器,這個(gè)關(guān)鍵字的值是從0.0 ~ 1.0
的NSNumber
值驼修,這個(gè)值表示:基于輸入圖像短邊長度的百分比殿遂。有效值范圍:0.01 <= CIDetectorMinFeatureSize <= 0.5
诈铛。為這個(gè)參數(shù)設(shè)定更高值僅用于提高性能。默認(rèn)值是0.15
墨礁。
@ 對于矩形探測器幢竹,這個(gè)關(guān)鍵字的值是從0.0 ~ 1.0
的NSNumber
值,這個(gè)值表示:基于輸入圖像短邊長度的百分比饵溅。有效值范圍:0.2 <= CIDetectorMinFeatureSize <= 1.0
的默認(rèn)值是0.2
妨退。
@ 對于文本探測器简卧,這個(gè)關(guān)鍵字的值是一個(gè)范圍從0.0 ~ 1.0
的NSNumber
值芭挽,這個(gè)值表示:基于輸入圖像高度的百分比。有效值范圍:0.0 <= CIDetectorMinFeatureSize <= 1.0
迷捧。默認(rèn)值是10/(輸入圖像的高度)
轻掩。CIDetectorMaxFeatureCount
是針對矩形探測器的幸乒,用于設(shè)置返回矩形特征的最多個(gè)數(shù)。這個(gè)關(guān)鍵字的值是一個(gè)1~...
的NSNumber
值唇牧。有效范圍1 < = CIDetectorMaxFeatureCount < = 256
罕扎。默認(rèn)值為1
。CIDetectorNumberOfAngles
用于設(shè)置角度的個(gè)數(shù)丐重,值是1腔召、3、5扮惦、7臀蛛、9、11
中的一個(gè)值崖蜜。CIDetectorImageOrientation
用于設(shè)置識(shí)別方向浊仆,值是一個(gè)從1 ~ 8
的整型的NSNumber
。如果值存在豫领,檢測將會(huì)基于這個(gè)方向進(jìn)行抡柿,但返回的特征仍然是基于這些圖像的。CIDetectorEyeBlink
如果設(shè)置這個(gè)參數(shù)為true
(bool類型的NSNumber)等恐,識(shí)別器將提取眨眼特征洲劣。CIDetectorSmile
如果設(shè)置這個(gè)參數(shù)為ture
(bool類型的NSNumber),識(shí)別器將提取微笑特征鼠锈。CIDetectorFocalLength
用于設(shè)置每幀焦距闪檬,值得類型為floot類型
的NSNumber
。CIDetectorAspectRatio
用于設(shè)置矩形的長寬比购笆,值得類型為floot類型
的NSNumber
粗悯。CIDetectorReturnSubFeatures
控制文本檢測器是否應(yīng)該檢測子特征。默認(rèn)值是否同欠,值的類型為bool類型
的NSNumber
样傍。
使用實(shí)例
進(jìn)行識(shí)別的函數(shù)如下:
- (CI_ARRAY(CIFeature*) *)featuresInImage:(CIImage *)image
NS_AVAILABLE(10_7, 5_0);
- (CI_ARRAY(CIFeature*) *)featuresInImage:(CIImage *)image
options:(nullable CI_DICTIONARY(NSString*,id) *)options
NS_AVAILABLE(10_8, 5_0);
實(shí)例
這是一個(gè)在圖像上標(biāo)注眼睛和嘴的代碼片段
UIImage * imageInput = [_inputImgView image];
CIImage * image = [CIImage imageWithCGImage:imageInput.CGImage];
CIContext * context = [CIContext contextWithOptions:nil];
NSDictionary * param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
CIDetector * faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:param];
NSArray * detectResult = [faceDetector featuresInImage:image];
UIView * resultView = [[UIView alloc] initWithFrame:_inputImgView.frame];
[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];
if (faceFeature.hasLeftEyePosition) {
UIView * leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)];
[leftEyeView setCenter:faceFeature.leftEyePosition];
leftEyeView.layer.borderWidth = 1;
leftEyeView.layer.borderColor = [UIColor redColor].CGColor;
[resultView addSubview:leftEyeView];
}
if (faceFeature.hasRightEyePosition) {
UIView * rightEyeView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)];
[rightEyeView setCenter:faceFeature.rightEyePosition];
rightEyeView.layer.borderWidth = 1;
rightEyeView.layer.borderColor = [UIColor redColor].CGColor;
[resultView addSubview:rightEyeView];
}
if (faceFeature.hasMouthPosition) {
UIView * mouthView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 5)];
[mouthView setCenter:faceFeature.mouthPosition];
mouthView.layer.borderWidth = 1;
mouthView.layer.borderColor = [UIColor redColor].CGColor;
[resultView addSubview:mouthView];
}
}
在以上的代碼中
NSArray * detectResult = [faceDetector featuresInImage:image];
detectResult
是識(shí)別后返回的一個(gè)結(jié)果數(shù)組横缔,元素類型為CIFaceFeature
,這是一個(gè)人臉特征類衫哥,其中包括了的面部上的一些特征屬性茎刚,大家可以去這個(gè)類的頭文件中看一下,都是一些淺顯易懂的屬性撤逢,這里不再介紹膛锭。
實(shí)例代碼
這里是一個(gè)關(guān)于人臉識(shí)別的Demo:
https://github.com/MajorLMJ/LMJFaceRecognition
再多說一句其實(shí)我們可以通過人臉識(shí)別的功能實(shí)現(xiàn)像微信等應(yīng)用的頭像自動(dòng)識(shí)別剪裁功能。
版權(quán)聲明:出自MajorLMJ技術(shù)博客的原創(chuàng)作品 蚊荣,轉(zhuǎn)載時(shí)必須注明出處及相應(yīng)鏈接初狰!