iOS圖像處理(四)CIDetector特征識別(人臉識別)
前言
CIDetecror
是Core Image
框架中提供的一個識別類,包括對人臉乡括、形狀蚀浆、條碼、文本的識別香追,本文主要介紹人臉特征識別合瓢。
人臉識別功能不單單可以對人臉進行獲取,還可以獲取眼睛和嘴等面部特征信息透典。但是CIDetector
不包括面紋編碼提取晴楔,也就是說CIDetector
只能判斷是不是人臉,而不能判斷這張人臉是誰的峭咒,比如說面部打卡這種功能是實現(xiàn)不了的税弃。
創(chuàng)建
// 創(chuàng)建圖形上下文
CIContext * context = [CIContext contextWithOptions:nil];
// 創(chuàng)建自定義參數(shù)字典
NSDictionary * param = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
// 創(chuàng)建識別器對象
CIDetector * faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:context options:param];
我們先來看看識別器的類型都有哪些,這里我們設置的是CIDetectorTypeFace凑队,人臉識別探測器類型则果。
// 人臉識別探測器類型
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ù)傳入的西壮。這里的NSDictionary * param
就是我們要設置的參數(shù)字典遗增。
- 我們這里設置了一個識別精度
CIDetectorAccuracy
,識別精度的值有:
// 識別精度低款青,但識別速度快做修、性能高
CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyLow NS_AVAILABLE(10_7, 5_0);
// 識別精度高,但識別速度慢可都、性能低
CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyHigh NS_AVAILABLE(10_7, 5_0);
除了精度的設置缓待,還有
CIDetectorTracking
蚓耽,指定使用特種跟蹤渠牲,這個功能就像相機中的人臉跟蹤功能。CIDetectorMinFeatureSize
用于設置將要識別的特征的最小范圍步悠,也就是說小于這個范圍的特征將不識別签杈。@ 對于人臉檢測器
,這個關鍵字的值是一個范圍從0.0……1.0的NSNumber
值鼎兽,這個值表示基于輸入圖像短邊的百分比答姥。有效值范圍:0.01 <=CIDetectorMinFeatureSize
<= 0.5。為這個參數(shù)設定更高值僅用于提高性能谚咬。默認值是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/(輸入圖像的高度)辑鲤。CIDetectorNumberOfAngles
用于設置角度的個數(shù),值是1杠茬、3月褥、5、7瓢喉、9宁赤、11中的一個值。CIDetectorImageOrientation
用于設置識別方向灯荧,值是一個從1 . .8的整型的NSNumber礁击。如果值存在,檢測將會基于這個方向進行,但返回的特征仍然是基于這些圖像的哆窿。CIDetectorEyeBlink
如果設置這個參數(shù)為true
(bool類型的NSNumber)链烈,識別器將提取眨眼特征。DetectorSmile
如果設置這個參數(shù)為ture
(bool類型的NSNumber)挚躯,識別器將提取微笑特征强衡。CIDetectorFocalLength
用于設置每幀焦距,值得類型為floot類型的NSNumber
CIDetectorAspectRatio
用于設置矩形的長寬比码荔,值得類型為floot
類型的NSNumber
CIDetectorReturnSubFeatures
控制文本檢測器是否應該檢測子特征漩勤。默認值是否,值的類型為bool
類型的NSNumber
使用實例
進行識別的函數(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);
//options可以設置笑容等
實例
這是一個在圖像上標注眼睛和嘴的代碼片段
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ù)組缩搅,元素類型為CIFaceFeature
越败,這是一個人臉特征類,其中包括了的面部上的一些特征屬性硼瓣,大家可以去這個類的頭文件中看一下究飞,都是一些淺顯易懂的屬性,這里不再介紹堂鲤。
實例代碼
這里是一個關于人臉識別的Demo:
https://github.com/MajorLMJ/LMJFaceRecognition