CoreImage是Cocoa Touch中一個(gè)強(qiáng)大的API,用處非常大.在開(kāi)始之前,我們先要簡(jiǎn)單了解下CoreImage framework 組成.
coreImage 主要包含以下幾個(gè)組成部分
1? 定義部分:
? ? ?CoreImage 和CoreImageDefines ,代表了CoreImage 這個(gè)框架和它的定義。
2 ?操作部分:
濾鏡(CIFliter):CIFilter 產(chǎn)生一個(gè)CIImage。典型的,接受一到多的圖片作為輸入,經(jīng)過(guò)一些過(guò)濾操作,產(chǎn)生指定輸出的圖片。
檢測(cè)(CIDetector):CIDetector 檢測(cè)處理圖片的特性,如使用來(lái)檢測(cè)圖片中人臉的眼睛、嘴巴、等等。
特征(CIFeature):CIFeature 代表由 detector處理后產(chǎn)生的特征。
3 ?圖像部分:
畫(huà)布(CIContext):畫(huà)布類可被用與處理Quartz 2D 或者? OpenGL??梢杂盟鼇?lái)關(guān)聯(lián)CoreImage類。如濾鏡、顏色等渲染處理。
顏色(CIColor):? 圖片的關(guān)聯(lián)與畫(huà)布、圖片像素顏色的處理。
向量(CIVector): 圖片的坐標(biāo)向量等幾何方法處理。
圖片(CIImage): 代表一個(gè)圖像,可代表關(guān)聯(lián)后輸出的圖像。
好了,前期基礎(chǔ)準(zhǔn)備工作做好了,我么創(chuàng)建工程來(lái)實(shí)踐.
先創(chuàng)建一個(gè)工程 我命名為人臉識(shí)別,簡(jiǎn)單的在storyboard 中拖一個(gè)UImageView 然后生成屬性imageView
再往工程中導(dǎo)入一張圖片,我導(dǎo)入的是女神賈靜雯的,命名為01.jpg
然后我們添加一個(gè)方法? - (void)makefaceDetectWithImage:(UIImage *)image
#pragma mark - 識(shí)別人臉測(cè)試
- (void)makefaceDetectWithImage:(UIImage *)image {
//清除imageview的子控件
for (UIView *view in _imageView.subviews) {
[view removeFromSuperview];
}
// 圖像識(shí)別能力:可以在CIDetectorAccuracyHigh(較強(qiáng)的處理能力)與CIDetectorAccuracyLow(較弱的處理能力)中選擇,因?yàn)橄胱寽?zhǔn)確度高一些在這里選擇CIDetectorAccuracyHigh
NSDictionary *opts = [NSDictionary dictionaryWithObject:
CIDetectorAccuracyHigh forKey:CIDetectorAccuracy];
// 將圖像轉(zhuǎn)換為CIImage
CIImage *faceImage = [CIImage imageWithCGImage:image.CGImage];
CIDetector *faceDetector=[CIDetector detectorOfType:CIDetectorTypeFace context:nil options:opts];
// 識(shí)別出人臉數(shù)組
NSArray *features = [faceDetector featuresInImage:faceImage];
// 得到圖片的尺寸
CGSize inputImageSize = [faceImage extent].size;
//將image沿y軸對(duì)稱
CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, -1);
//將圖片上移
transform = CGAffineTransformTranslate(transform, 0, -inputImageSize.height);
// 取出所有人臉
for (CIFaceFeature *faceFeature in features){
//獲取人臉的frame
CGRect faceViewBounds = CGRectApplyAffineTransform(faceFeature.bounds, transform);
CGSize viewSize = _imageView.bounds.size;
CGFloat scale = MIN(viewSize.width / inputImageSize.width,
viewSize.height / inputImageSize.height);
CGFloat offsetX = (viewSize.width - inputImageSize.width * scale) / 2;
CGFloat offsetY = (viewSize.height - inputImageSize.height * scale) / 2;
// 縮放
CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scale, scale);
// 修正
faceViewBounds = CGRectApplyAffineTransform(faceViewBounds,scaleTransform);
faceViewBounds.origin.x += offsetX;
faceViewBounds.origin.y += offsetY;
//描繪人臉區(qū)域
UIView* faceView = [[UIView alloc] initWithFrame:faceViewBounds];
faceView.layer.borderWidth = 1.2;
faceView.layer.borderColor = [[UIColor colorWithRed:220/255.0 green:62/255.0 blue:70/255.0 alpha:1] CGColor];
[_imageView addSubview:faceView];
// 判斷是否有左眼位置
if(faceFeature.hasLeftEyePosition){
NSLog(@"---找到了左眼");
}
// 判斷是否有右眼位置
if(faceFeature.hasRightEyePosition){
NSLog(@"找到了右眼");
}
// 判斷是否有嘴位置
if(faceFeature.hasMouthPosition){
NSLog(@"找到了嘴巴");
}
}
}
然后再viewDidload 里面調(diào)用這個(gè)方法
看打印結(jié)果
2017-09-08 10:03:04.683 人臉識(shí)別[2132:66473] ---找到了左眼
2017-09-08 10:03:04.683 人臉識(shí)別[2132:66473] 找到了右眼
2017-09-08 10:03:04.683 人臉識(shí)別[2132:66473] 找到了嘴巴
效果圖

這就是人臉識(shí)別的簡(jiǎn)單應(yīng)用了 ,當(dāng)然啦 網(wǎng)上還有很多封裝好的第三方庫(kù)可以使用,但是基本的原理還是要知道的.