Sunteți pe pagina 1din 12

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

divertindo com a detecção facial (Tutorial + Código http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código)

Com a biblioteca OpenCv possível fazer bastante coisa, o foco desse post é a detecção facial. Para quer tiver interessado em conhecer um pouco mais: http://opencv.org/

Vamos utilizar Java que é umas das linguagens suportadas. Como vamos brincar com essa biblioteca iremos construir um aplicativo para desfocar apenas os rotos das pessoas em fotos:

um aplicativo para desfocar apenas os rotos das pessoas em fotos: "Chaves de menor": Atenção, Creuzebek!

"Chaves de menor":

Atenção, Creuzebek!

Popular Posts Java E OpenCv - Se Divertindo Com A Detecção Facial (Tutorial + Código)
Popular Posts
Java E
OpenCv - Se
Divertindo Com
A Detecção
Facial (Tutorial +
Código)
Corrigindo Os
Decimais No
ASP.NET MVC
(Tutorial +
Código)
Carregamento
Progressivo De
Imagens Com
ASP.NET MVC E
JQuery
Java -
Paramêtros De
Comprimento
Variável

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

Faça do download da biblioteca no site do OpenCv:

http://opencv.org/. Crie um projeto Java no Eclipse.

Clique com o potão direito sobre o seu projeto vá em:

Build Path -> Configure Build Path, espanda o item referente a JRE clique em edit e selecione o diretório onde estão as bibliotecas nativas do OpenCv que por padrão estão em C:/opencv/opencv/build/java/x86, mas pode mudar dependendo da sua instalação.

mas pode mudar dependendo da sua instalação. Nesse projeto eu utilizei os conceitos do SOLID, que

Nesse projeto eu utilizei os conceitos do SOLID, que bem resumidamente diz que cada classe deve servir a um único propósito. Dessa forma essa ficou sendo a minha estrutura de pacotes:

Dessa forma essa ficou sendo a minha estrutura de pacotes: Para começar coloque a linha a

Para começar coloque a linha a seguir no main do seu código antes de qualquer outro trecho:

public static void main(String[] args) {

System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Essa linha é responsável por "invocar" as bibliotecas nativas que inserimos anteriormente, que na realidade é quem faz todo o trabalho. Logo após você precisará

JavaScript - Utilizando O SHJS Para Deixar Seu Código Bonito Na WEB Inserindo E Removendo

JavaScript - Utilizando O SHJS Para Deixar Seu Código Bonito Na WEB

- Utilizando O SHJS Para Deixar Seu Código Bonito Na WEB Inserindo E Removendo Itens Da

Inserindo E Removendo Itens Da Coleção ASP.NET MVC Parte 1 (Tutorial + Código)

Seu Cliente Nunca Mais Precisará Limpar O Cache

You Never More Need To Clear Cache!

Limpar O Cache You Never More Need To Clear Cache! Eliminando A Dependência Dos Índices Em

Eliminando A Dependência Dos Índices Em Coleções No ASP.NET MVC

Unindo Expressions Para Gerar Uma Query Codicional - C# E Entity Framework

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

carregar um arquivo xml que contém as parametrizações necessárias para fazer o reconhecimento dos rostos:

CascadeClassifier cascadeClassifier = new Cascad

Bom aí você me pergunta onde encontro esse arquivo? dependendo da sua instalação ele fica arqui: C:\opencv \opencv\sources\data\haarcascades . Sugiro que você copie esse arquivo para raiz do seu projeto e carregue ele como está acima. Após isso precisamos carregar a imagem, você deve fazer dessa forma:

Mat mat = Highgui.imread(System.getProperty("use

No método imread você passa o caminho até o arquivo.

Para facilitar o entendimento eu crie um diagrama de atividades que ilustra os passos necessários para a brincadeira acontecer:

ilustra os passos necessários para a brincadeira acontecer: Labels ASP.NET MVC C# Cache Collection

Labels

ASP.NET MVC

ASP.NET MVC

C#

C#

Cache

Cache

Collection

Collection

HTML

HTML

Java

Java

JavaScript

JavaScript

JQuery

JQuery

OpenCV

OpenCV

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

Passo 1 - Detectar faces

Para essa atividade ou passo está na

classe ServiceDeteccaoFacesImagem e temo o método

que faz a detecção das faces:

public MatOfRect detectarFaces(CascadeClassifier MatOfRect matOfRect = new MatOfRect(); cascadeClassifier.detectMultiScale(mat, matOfRec return matOfRect;

}

Esse método recebe os dois objeto criados anteriormente, que são respectivamente: a classe que "carrega" o xml e a classe que "carrega" a imagem. o objeto

CascadeClassifier contém o método detectMultScale que

localiza o que está sendo procurado na imagem que em nosso caso são rostos.

Passo 2 - Obter dados das faces

Os dados que serão obtidos das faces serão sua posição (x,y) na imagem e a largura e altura da face. O método a seguir contém a lógica de extração desses dados novamente a classe utilizada

é ServiceDeteccaoFacesImagem:

public List obterDadosFaces(MatOfRect matOfRect)

List dados = new ArrayList();

for (Rect rect : matOfRect.toArray()) {

PropriedadesFace prop = new PropriedadesFace( prop.setX(rect.x); prop.setY(rect.y); prop.setHeight(rect.height); prop.setWidth(rect.width);

dados.add(prop);

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

}

return dados;

}

Notem que o retorno é uma lista do objeto PropriedadesFace abaixo o modelo da classe desse objeto, ocultado os geters e seteres:

public class PropriedadesFace { private int x; private int y; private int width; private int height; private BufferedImage imageCortada;

Passo 3 - Desfocar toda a imagem

Vamos desfocar a imagem antes de "recortar" as faces, essa atividade está na classe ServiceDesfoqueImagem:

public BufferedImage DesfocarImagem(Mat mat){

mat = Desfocar(mat);

return Util.converterParaImage(mat);

}

private Mat Desfocar(Mat image){

Mat destination = new Mat(image.rows(),image.c

Imgproc.GaussianBlur(image, destination,new Si

return destination;

}

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

Temos aqui esses 2 métodos um recebe o objeto Mat e o outro faz o desfoque da imagem. O desfoque é feito utilizado o método GaussianBlur da classe Imgproc, que pode ser invocado diretamente porque é um método estático. Por fim convertemos o objeto Mat para o BufferedImage, esse método se encontra na classe Util:

public static BufferedImage converterParaImage(M

MatOfByte bytemat = new MatOfByte();

Highgui.imencode(".jpg", image, bytemat);

byte[] bytes = bytemat.toArray();

InputStream in = new ByteArrayInputStream(byte

BufferedImage img=null;

try { img = ImageIO.read(in); } catch (IOException e) { e.printStackTrace();

}

return img;

}

Passo 4 - Recortar as faces da imagem

Para cortar as faces da imagem utilizamos o

método CortarImagem da classe ServiceCorteImagem:

public List CortarImagem(List dados, BufferedIma

for(PropriedadesFace dado : dados){ dado.setImageCortada(imagem.getSubimage(dado.

}

return dados;

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

}

Utilizamos o método getSubImage para "cortar" uma determinada parte da imagem e a imagem "cortada" é incluída no objeto PropriedadesFace, o mesmo objeto que contém seus dados.

Passo 5 - Obter imagem sem o desfoque

Para obter essa imagem utilizamos o método

converterParaImagem na classe Util:

public static BufferedImage converterParaImage(M

MatOfByte bytemat = new MatOfByte();

Highgui.imencode(".jpg", image, bytemat);

byte[] bytes = bytemat.toArray();

InputStream in = new ByteArrayInputStream(byte

BufferedImage img=null;

try { img = ImageIO.read(in); } catch (IOException e) { e.printStackTrace();

}

return img;

}

Essa imagem vai servir como fundo para "colarmos" as imagens dos rostos desfocados sobre ela.

Passo 6 - Juntar imagem com as faces recortadas

Utilizamos esse dois métodos para sobrepor as imagens:

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

public BufferedImage juntarImagens(List dados, B

for(PropriedadesFace dado: dados){ imagemPrincipal = juntarUmaImage(imagemPrinci

}

return imagemPrincipal;

}

public static BufferedImage juntarUmaImage(Buff BufferedImage imagemCortada, int x,

Graphics2D g = imagemPrincipal.createGra

g.setRenderingHint(RenderingHints.KEY_AN

RenderingHints.VALUE_ANTIALIAS_O

g.drawImage(imagemPrincipal, 0,0, null);

g.drawImage(imagemCortada, x, y, null);

g.dispose(); return imagemPrincipal;

}

O primeiro percorre todas as imagens que estão juntas com os dados das suas posições, já o segundo faz a sobreposição em si. Os dois métodos estão na

classe ServiceSobreposicaoImagem.

Para terminar

Esse é o código do método main responsável por sequenciar as chamadas dos métodos:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

CascadeClassifier cascadeClassifier = new Casc

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

Mat mat = Highgui.imread(System.getProperty("u

ServiceDeteccaoFacesImagem serviceExtractFaces MatOfRect matOfRect = serviceExtractFaces.dete

List propsFaces = serviceExtractFaces.obterDad

ServiceDesfoqueImagem serviceBlur = new Servic BufferedImage imagemCorteDesfoque = serviceBlu

ServiceCorteImagem serviceCrop = new ServiceCo propsFaces = serviceCrop.CortarImagem(propsFac

ServiceSobreposicaoImagem serviceOverlay = new

BufferedImage imagemSemEfeitos = Util.converte

imagemCorteDesfoque = serviceOverlay.juntarIma

File outputfile = new File("chaves menor.jpg")

try { ImageIO.write(imagemCorteDesfoque, "jpg", out } catch (IOException e) { e.printStackTrace();

}

E é isso galera quem quiser o código ele pode ser acessado aqui:

https://github.com/rafaelguinho/HidingHerFace

Java

OpenCV

11 Comentários:

Michel Machado De Moraes

31 de dezembro de 2014 10:03

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

Ótimo post! Parabéns! Aqui deu certo! Porém quando maiores, o desfoque foi quase imperceptível. Onde devo m esse detalhe? Além disso, desejo saber se usando essa posso fazer comparações entre fotos para saber se elas são ou comparar a imagem obtida em uma webcam com uma f

Daniel Batista

5 de novembro de 2015 12:15

Cara.

org.opencv.highgui.Highgui; ``

Aqui

esta

dando

erro

nesse

im

Bruno Zorzetto

11 de novembro de 2015 11:15

Você deve importar o .jar da blblioteca OpenCV, creio qu problema.

Unknown

20 de novembro de 2015 12:15

A partir da versão 3, este comando foi alterado. Utilize no lugar:

import org.opencv.imgcodecs.Imgcodecs;

Exemplo:

Imgcodecs.imencode(fileExten, matrix, mob);

Unknown

26 de maio de 2017 14:06

Não se usa mais o Highgui, os metodos dele foram para imgproc

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

Unknown

11 de janeiro de 2016 10:48

Amigo, esse código serve para imagens limerializadas ?

João Paulo

22 de março de 2016 09:55

O que é esse eclipse

BlogTeste

23 de março de 2017 13:25

É quando a supelua fica minguante

Unknown

16 de agosto de 2016 08:00

Como será o código para reconhecimento dos olhos abert não sendo em imagem e sim em vídeo?

Baby

13 de novembro de 2016 09:31

Classe main um erro System.loadLibrary(Core.NATIVE_LIBRA run:

Exception in thread "main" java.lang.RuntimeException: Un code - Erroneous tree type:

at main.Principal.main(Principal.java:30)

C:\Users\Maquinador Chefe\AppData\Local\NetBeans\C snippets\run.xml:53: Java returned: 1

FALHA NA CONSTRUÇÃO (tempo total: 1 segundo)

Java e OpenCv - Se divertindo com a detecção facial (Tutorial + Código

http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-

desculpa se isso for um erro simples, mas preciso de ajuda orientando pelo seu código para desenvolver o meu. muito seu código, á eu estou usando o Netbeans pra programar.

Mario Sergio

23 de novembro de 2016 12:15

Já existem componentes prontos e de facil utilização, olhe e www.dvoz.org

Comentar como: Publicar

Comentar como:

Comentar como: Publicar
Publicar
Publicar
Comentar como: Publicar
olhe e www.dvoz.org Comentar como: Publicar © Todos os direitos reservados O negócio é programar 12

© Todos os direitos reservados O negócio é programar