Tutorial iOS – Detecção de rostos em fotos

On 30 de setembro de 2014 by Conrado Carneiro

Hoje iremos abordar um assunto diferente, com um nível maior de dificuldade, porém o resultado é muito interessante.
Iremos inicialmente fazer um aplicativo que irá identificar os rostos das pessoas em uma foto especifica, posteriormente a objetivo é alterar o aplicativo para identificar os rostos de fotos disponíveis no álbum ou até mesmo de fotos tiradas na hora e por fim, no ultimo tutorial iremos utilizando o framework OpenCV identificar se a pessoa piscou, se está sorrindo entre outras coisas.

Bom, mãos a obra!

Após criar um projeto no Xcode, processo que já estamos bem familiarizados deveremos adicionar as seguintes bibliotecas:

– CoreGraphics.framewok
– CoreImage.framework
– QuartzCore.framework
– UIKit.framework
– Foundation.framework

Para isso, devemos selecionar o arquivo do projeto (1), ir na Aba General (2) e clicar no +  na opção de Linked Frameworks and Libraries

Captura de Tela 2014-09-30 às 17.15.06

Após adicionar os framework o resultado deverá ser semelhante a imagem a seguir:

Captura de Tela 2014-09-30 às 17.21.21

Agora deveremos adicionar um objeto UIImageView ao  arquivo da Main.Storyboard, vale lembrar que o tamanho da imagem a ser exibida será semelhante ao tamanho definido nessa etapa, conforme você pode observar, defini que a Image View ocupasse quase toda a tela, deixando espaço para alguns botões que iremos colocar posteriormente.
Captura de Tela 2014-09-30 às 17.27.43

Linkar o Objeto UIImageView ao código ViewController.h é algo que já ensinamos anteriormente e é fundamental para a continuação do tutorial…

Agora vamos programar literalmente, o primeiro passo é criar o objeto UIImage e atribui-lo a UIImageView criada, que no exemplo em questão atribuímos o nome de  imageView,  para tanto, você deverá colocar o seguinte código dentro da função ViewDidLoad no arquivo ViewController.m:

 

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
UIImage *image = [UIImage imageNamed:@"jobs.jpg"];
_imageView.image = image;
[/sourcecode]

vale lembrar que o arquivo de imagem deve ser adicionado ao projeto e o nome do arquivo deverá ser o mesmo definido na função imageNamed que no caso atribui como jobs.jpg

Agora a brincadeira começa a ficar séria, vamos definir a função responsável em identificar o rosto na imagem.
Você poderá defini-la com o nome que quiser, irei chama-la de  detectedFacesInImage. Seu cabeçalho ficará da seguinte forma:

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
-(void)<strong>detectedFacesInImage</strong>:(UIImage *)image
[/sourcecode]

primeiro devemos criar o objeto do tipo CIImage e atribuir a ele os meta dados da imagem, para fazer isso, basta utilizar o seguinte código:

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
CIImage* imageData = [CIImage imageWithCGImage:image.CGImage];
[/sourcecode]

Agora precisamos criar o objeto CIDetector  que será o responsável, no caso, em identificar as faces, para isso basta cria-lo definindo a seguinte configuração:

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
CIDetector* detector;
detector = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil
options:[NSDictionary dictionaryWithObject:CIDetectorAccuracyLow
forKey:CIDetectorAccuracy]];
[/sourcecode]

Agora que já configuramos o detector de Face, agora vamos aplica-lo na imagem e atribuir o resultado a um array:

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
NSArray* recursos = [detector featuresInImage:imageData];
[/sourcecode]

Agora precisamos analisar as informações armazenadas no Array e aplicar um efeito visual no local da foto do recurso identificado, basta apenas percorrer o Array conforme mostrado a seguir:

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
for(CIFaceFeature* faceObject in recursos) {
CGRect modifiedFaceBounds = faceObject.bounds;
modifiedFaceBounds.origin.y = facePicture.size.height-faceObject.bounds.size.height-faceObject.bounds.origin.y;

[self addSubViewWithFrame:modifiedFaceBounds];

if(faceObject.hasLeftEyePosition) {

CGRect leftEye = CGRectMake(faceObject.leftEyePosition.x,(facePicture.size.height-faceObject.leftEyePosition.y), 10, 10);
[self addSubViewWithFrame:leftEye];
}

if(faceObject.hasRightEyePosition) {

CGRect rightEye = CGRectMake(faceObject.rightEyePosition.x, (facePicture.size.height-faceObject.rightEyePosition.y), 10, 10);
[self addSubViewWithFrame:rightEye];

}
if(faceObject.hasMouthPosition) {
CGRect mouth = CGRectMake(faceObject.mouthPosition.x,facePicture.size.height-faceObject.mouthPosition.y,10, 10);
[self addSubViewWithFrame:mouth];
}
}
[/sourcecode]

No código acima informamos a região do rosto e verificamos se há olho esquerdo, olho direito e boca e a cada uma dessas regiões a função addSubViewWithFrame: é chamada e é essa função a responsável em desenhar na imagem.

A seguir o seu código:

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
-(void)addSubViewWithFrame:(CGRect)frame {
UIView* highlitView = [[UIView alloc] initWithFrame:frame];
highlitView.layer.borderWidth = 1;
highlitView.layer.borderColor = [[UIColor colorWithRed:1.000
green:0.107
blue:0.109
alpha:1.000] CGColor];
[imageView addSubview:highlitView];
}
[/sourcecode]

Como resultado temos a imagem a seguir:

Untitled

 

Caso tenha alguma dúvida, você pode baixar o projeto completo no link.

Deixe um comentário

O seu endereço de e-mail não será publicado.