初識(shí) 人臉檢測(cè)識(shí)別

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ù)可以使用,但是基本的原理還是要知道的.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容