iOS CIDetector的使用

最近想學(xué)習(xí)下在iOS中識(shí)別人臉的技術(shù),搜素中找到了CIDector,進(jìn)而找到了各種例子:

CIContext* context = [CIContextcontextWithOptions:nil];

UIImage* imageInput = [self.imageViewimage];

CIImage* image = [CIImageimageWithCGImage:imageInput.CGImage];

//設(shè)置識(shí)別參數(shù)

NSDictionary* param = [NSDictionarydictionaryWithObject:CIDetectorAccuracyHigh

forKey:CIDetectorAccuracy];

//聲明一個(gè)CIDetector,并設(shè)定識(shí)別類(lèi)型

CIDetector* faceDetector = [CIDetectordetectorOfType:CIDetectorTypeFace

context:context

options:param];

//取得識(shí)別結(jié)果

NSArray* detectResult = [faceDetector featuresInImage:image];

UIView* resultView = [[UIView alloc]initWithFrame:self.imageView.frame];

[self.viewaddSubview:resultView];

for(CIFaceFeature* faceFeature in detectResult) {

//臉部

UIView* faceView = [[UIView alloc]initWithFrame:faceFeature.bounds];

faceView.layer.borderWidth=1;

faceView.layer.borderColor= [UIColororangeColor].CGColor;

[resultView addSubview:faceView];

//左眼

if(faceFeature.hasLeftEyePosition) {

}

//右眼

if(faceFeature.hasRightEyePosition) {

}

//嘴巴

if(faceFeature.hasMouthPosition) {

}

}

[resultViewsetTransform:CGAffineTransformMakeScale(1, -1)];

如上代碼,大部分都是這種樣子的,這是使用CIDetector基礎(chǔ)的代碼,但是運(yùn)行之(這里用到了偶像gaga的圖片268*381,(*@ο@*) 哇~),


這是what?橙色的框識(shí)別臉到哪去了????!可能有很多大神會(huì)很快補(bǔ)點(diǎn)代碼解決這個(gè)問(wèn)題:[resultViewsetTransform:CGAffineTransformMakeScale(1, -1)] , balabala......

但是我這個(gè)愚公啊,花了好多時(shí)間來(lái)驗(yàn)證正確的坐標(biāo):

首先我把faceFeature的bounds和UIImage.size打印出來(lái)(faceFeature之所以在一個(gè)數(shù)組里,這個(gè)圖要是有很多臉呢):

faceFrame===={{98, 182}, {138, 138}},imageSize===={134, 190.5}

faceFrame就是上面桔框顯示的位置,imageSize是圖片大小,what?我的圖片是268*381啊,怎么會(huì)是一半:ios - Why the property Size of UIImage is half of the real picture size? - Stack Overflow

好吧UIImage這里size是真實(shí)的一半,因?yàn)锧2x什么的。

但是,為什么faceFrame的位置是這樣?

于是我打開(kāi)ps,用faceFrame的位置東拼西湊:

得出gaga臉部框的frame是(98,61,138,138),這不是除了Y值其他都和打印出來(lái)的都一樣么,可上面模擬器上的圖片連x值都不一樣啊,這是因?yàn)閳D片在UIImageView有縮放的問(wèn)題(imgView的寬度又不是138,這個(gè)一會(huì)再說(shuō))

Y值是怎么算出來(lái)的呢,首先我用圖片的高減去當(dāng)前的Y得到的是上圖矩形底邊的Y值199,然后再減去矩形的高度138得出61,這樣就有了上圖矩形坐標(biāo)的值,這樣看好像是坐標(biāo)系需要轉(zhuǎn)換(誰(shuí)有關(guān)于這塊好的鏈接或者講解一下這塊給我留言,謝謝?。酱藞D片臉部識(shí)別框正確顯示在ps中了。

那么轉(zhuǎn)換到代碼上,寫(xiě)了個(gè)方法:

- (CGRect)convert2SuitRect:(CGRect)pRect

{

UIImage* tempImg =self.imageView.image;

float ratio4RealAndShow =

self.imageView.frame.size.width(tempImg.size.width*2.0);

CGRect resultRect =

CGRectMake(pRect.origin.x* ratio4RealAndShow, (tempImg.size.height*2- pRect.origin.y- pRect.size.height) * ratio4RealAndShow, ?pRect.size.width* ratio4RealAndShow, pRect.size.height* ratio4RealAndShow);

return resultRect;

}

說(shuō)明一下:

pRect=faceFeature.bounds;

ratio4RealAndShow是imgView和真實(shí)圖片的比例(我已經(jīng)在其他代碼處理了imgView寬高比例和真實(shí)圖片寬高比例相等:CGRectMake(0,0,kDeviceWidth,kDeviceWidth* (tImg.size.height/ tImg.size.width)),

所以這里多了個(gè) *2.0

然后x值 pRect.origin.x* ratio4RealAndShow只需要轉(zhuǎn)換一下比例,

y值 ((tempImg.size.height*2- pRect.origin.y- pRect.size.height) * ratio4RealAndShow)就是上面ps中圖片的邏輯,圖片高-檢測(cè)Y-檢測(cè)高,乘一下比例,

寬和高也是只需要乘一下比例。到此一個(gè)檢測(cè)出來(lái)的frame轉(zhuǎn)換成了可用的ImgView上的frame,然后在上面引用代碼的地方檢測(cè)到的frame都用這個(gè)方法轉(zhuǎn)換一下:

CGRectfaceRect = [self convert2SuitRect:realityFaceRect];

完美的解決了問(wèn)題(眼部和嘴檢測(cè)的時(shí)候有faceWid*0.15或者0.3之類(lèi)的,是大概估摸眼或者嘴巴占整個(gè)臉的比例):

最后編輯于
?著作權(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)容