CoreImage是Cocoa Touch中一個(gè)強(qiáng)大的API,用處非常大.在開始之前镐侯,我們先要簡單了解下CoreImage framework 組成.
coreImage 主要包含以下幾個(gè)組成部分
1? 定義部分:
? ? ?CoreImage 和CoreImageDefines ,代表了CoreImage 這個(gè)框架和它的定義估脆。
2 ?操作部分:
濾鏡(CIFliter):CIFilter 產(chǎn)生一個(gè)CIImage殊轴。典型的穆役,接受一到多的圖片作為輸入,經(jīng)過一些過濾操作梳凛,產(chǎn)生指定輸出的圖片耿币。
檢測(CIDetector):CIDetector 檢測處理圖片的特性,如使用來檢測圖片中人臉的眼睛韧拒、嘴巴淹接、等等。
特征(CIFeature):CIFeature 代表由 detector處理后產(chǎn)生的特征叛溢。
3 ?圖像部分:
畫布(CIContext):畫布類可被用與處理Quartz 2D 或者? OpenGL塑悼。可以用它來關(guān)聯(lián)CoreImage類楷掉。如濾鏡厢蒜、顏色等渲染處理。
顏色(CIColor):? 圖片的關(guān)聯(lián)與畫布烹植、圖片像素顏色的處理斑鸦。
向量(CIVector): 圖片的坐標(biāo)向量等幾何方法處理。
圖片(CIImage): 代表一個(gè)圖像草雕,可代表關(guān)聯(lián)后輸出的圖像巷屿。
好了,前期基礎(chǔ)準(zhǔn)備工作做好了,我么創(chuàng)建工程來實(shí)踐.
先創(chuàng)建一個(gè)工程 我命名為人臉識別,簡單的在storyboard 中拖一個(gè)UImageView 然后生成屬性imageView
再往工程中導(dǎo)入一張圖片,我導(dǎo)入的是女神賈靜雯的,命名為01.jpg
然后我們添加一個(gè)方法? - (void)makefaceDetectWithImage:(UIImage *)image
#pragma mark - 識別人臉測試
- (void)makefaceDetectWithImage:(UIImage *)image {
//清除imageview的子控件
for (UIView *view in _imageView.subviews) {
[view removeFromSuperview];
}
// 圖像識別能力:可以在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ù)組
NSArray *features = [faceDetector featuresInImage:faceImage];
// 得到圖片的尺寸
CGSize inputImageSize = [faceImage extent].size;
//將image沿y軸對稱
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 人臉識別[2132:66473] ---找到了左眼
2017-09-08 10:03:04.683 人臉識別[2132:66473] 找到了右眼
2017-09-08 10:03:04.683 人臉識別[2132:66473] 找到了嘴巴
效果圖
這就是人臉識別的簡單應(yīng)用了 ,當(dāng)然啦 網(wǎng)上還有很多封裝好的第三方庫可以使用,但是基本的原理還是要知道的.