Você está na página 1de 12

Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

Java e OpenCv - Se Popular Posts

divertindo com a Java E

deteco facial OpenCv - Se


Divertindo Com
(Tutorial + Cdigo) A Deteco
Facial (Tutorial +
Com a biblioteca OpenCv possvel fazer bastante coisa, o Cdigo)
foco desse post a deteco facial. Para quer tiver
interessado em conhecer um pouco
mais:http://opencv.org/
Corrigindo Os
Vamos utilizar Java que umas das linguagens Decimais No
suportadas. Como vamos brincar com essa biblioteca
ASP.NET MVC
iremos construir um aplicativo para desfocar apenas os
(Tutorial +
rotos das pessoas em fotos:
Cdigo)

Carregamento
Progressivo De
Imagens Com
ASP.NET MVC E
JQuery

Java -

"Chaves de menor":

Paramtros De
Ateno, Creuzebek! Comprimento
Varivel

1 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

Faa do download da biblioteca no site do OpenCv:


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

JavaScript -
Clique com o poto direito sobre o seu projeto v em:
Utilizando O
Build Path -> Congure Build Path,
SHJS Para Deixar
espanda o item referente a JRE clique em edit e selecione
Seu Cdigo
o diretrio
onde esto as bibliotecas nativas do OpenCv que por Bonito Na WEB
padro esto em C:/opencv/opencv/build/java/x86,
mas pode mudar dependendo da sua instalao.

Inserindo E
Removendo
Itens Da Coleo
ASP.NET MVC
Parte 1 (Tutorial
+ Cdigo)

Seu Cliente
Nunca Mais
Precisar Limpar
Nesse projeto eu utilizei os conceitos do SOLID, que bem
O Cache
resumidamente diz que cada classe deve servir a um
nico propsito. Dessa forma essa cou sendo a minha You Never More
estrutura de pacotes: Need To Clear
Cache!

Eliminando A
Dependncia
Dos ndices Em
Colees No
Para comear coloque a linha a seguir no main do seu
ASP.NET MVC
cdigo antes de qualquer outro trecho:
Unindo
Expressions
Para Gerar Uma
public static void main(String[] args) {
Query
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); Codicional - C# E
Essa linha responsvel por "invocar" as bibliotecas Entity
nativas que inserimos anteriormente, que na realidade Framework
quem faz todo o trabalho. Logo aps voc precisar

2 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

carregar um arquivo xml que contm as parametrizaes


necessrias para fazer o reconhecimento dos rostos: Labels

ASP.NET MVC
CascadeClassifier cascadeClassifier = new CascadeClassifier
C#

Cache
Bom a voc me pergunta onde encontro esse arquivo?
dependendo da sua instalao ele ca arqui: C:\opencv Collection
\opencv\sources\data\haarcascades . Sugiro que voc
copie esse arquivo para raiz do seu projeto e carregue ele HTML
como est acima.
Java
Aps isso precisamos carregar a imagem, voc deve fazer
dessa forma: JavaScript

JQuery
Mat mat = Highgui.imread(System.getProperty("user.dir"
OpenCV

No mtodo imread voc passa o caminho at o arquivo.

Para facilitar o entendimento eu crie um diagrama de


atividades que ilustra os passos necessrios para a
brincadeira acontecer:

3 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

Passo 1 - Detectar faces

Para essa atividade ou passo est na


classeServiceDeteccaoFacesImageme temo o mtodo
que faz a deteco das faces:

public MatOfRect detectarFaces(CascadeClassifier


MatOfRect matOfRect = new MatOfRect();
cascadeClassifier.detectMultiScale(mat, matOfRect
return matOfRect;

Esse mtodo recebe os dois objeto criados anteriormente,


que so respectivamente: a classe que "carrega" o xml e a
classe que "carrega" a imagem. o objeto
CascadeClassiercontm o mtodo detectMultScale que
localiza o que est sendo procurado na imagem que em
nosso caso so rostos.

Passo 2 - Obter dados das faces

Os dados que sero obtidos das faces sero sua posio


(x,y) na imagem e a largura e altura da face. O mtodo a
seguir contm a lgica de extrao 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);

4 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... 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 classeServiceDesfoqueImagem:

public BufferedImage DesfocarImagem(Mat mat){

mat = Desfocar(mat);

return Util.converterParaImage(mat);
}

private Mat Desfocar(Mat image){

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

Imgproc.GaussianBlur(image, destination,new Size

return destination;
}

5 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

Temos aqui esses 2 mtodos um recebe o objeto Mat e o


outro faz o desfoque da imagem. O desfoque feito
utilizado o mtodoGaussianBlurda classeImgproc,que
pode ser invocado diretamente porque um mtodo
esttico. Por m convertemos o objeto Mat para o
BueredImage, esse mtodo se encontra na classe Util:

public static BufferedImage converterParaImage(Mat

MatOfByte bytemat = new MatOfByte();

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

byte[] bytes = bytemat.toArray();

InputStream in = new ByteArrayInputStream(bytes

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


mtodoCortarImagem da classeServiceCorteImagem:

public List CortarImagem(List dados, BufferedImage

for(PropriedadesFace dado : dados){


dado.setImageCortada(imagem.getSubimage(dado.getX
}

return dados;

6 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

Utilizamos o mtodo getSubImage para "cortar" uma


determinada parte da imagem e a imagem "cortada"
includa no objeto PropriedadesFace, o mesmo objeto que
contm seus dados.

Passo 5 - Obter imagem sem o desfoque

Para obter essa imagem utilizamos o mtodo


converterParaImagem na classe Util:

public static BufferedImage converterParaImage(Mat

MatOfByte bytemat = new MatOfByte();

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

byte[] bytes = bytemat.toArray();

InputStream in = new ByteArrayInputStream(bytes

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 mtodos para sobrepor as imagens:

7 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

public BufferedImage juntarImagens(List dados, BufferedImage

for(PropriedadesFace dado: dados){


imagemPrincipal = juntarUmaImage(imagemPrincipal
}

return imagemPrincipal;

public static BufferedImage juntarUmaImage(BufferedImage


BufferedImage imagemCortada, int x, int

Graphics2D g = imagemPrincipal.createGraphics

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING
RenderingHints.VALUE_ANTIALIAS_ON

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

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

g.dispose();
return imagemPrincipal;
}

O primeiro percorre todas as imagens que esto juntas


com os dados das suas posies, j o segundo faz a
sobreposio em si. Os dois mtodos esto na
classeServiceSobreposicaoImagem.

Para terminar

Esse o cdigo do mtodo main responsvel por


sequenciar as chamadas dos mtodos:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

CascadeClassifier cascadeClassifier = new CascadeClassifier

8 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

Mat mat = Highgui.imread(System.getProperty("user.dir"

ServiceDeteccaoFacesImagem serviceExtractFaces
MatOfRect matOfRect = serviceExtractFaces.detectarFaces

List propsFaces = serviceExtractFaces.obterDadosFaces

ServiceDesfoqueImagem serviceBlur = new ServiceDesfoqueImagem


BufferedImage imagemCorteDesfoque = serviceBlur

ServiceCorteImagem serviceCrop = new ServiceCorteImagem


propsFaces = serviceCrop.CortarImagem(propsFaces

ServiceSobreposicaoImagem serviceOverlay = new

BufferedImage imagemSemEfeitos = Util.converterParaImage

imagemCorteDesfoque = serviceOverlay.juntarImagens

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

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

E isso galera quem quiser o cdigo ele pode ser


acessado aqui:
https://github.com/rafaelguinho/HidingHerFace

Java OpenCV

11 Comentrios:

Michel Machado De Moraes


31 de dezembro de 2014 10:03

9 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

timo post! Parabns! Aqui deu certo! Porm quando testei com fotos
maiores, o desfoque foi quase imperceptvel. Onde devo mexer para resolver
esse detalhe? Alm disso, desejo saber se usando essa biblioteca OpenCV
posso fazer comparaes entre fotos para saber se elas so da mesma pessoa
ou comparar a imagem obtida em uma webcam com uma foto armazenada.

Daniel Batista
5 de novembro de 2015 12:15

Cara. Aqui esta dando erro nesse import ``import


org.opencv.highgui.Highgui; ``

Bruno Zorzetto
11 de novembro de 2015 11:15

Voc deve importar o .jar da blblioteca OpenCV, creio que seja esse o
problema.

Unknown
20 de novembro de 2015 12:15

A partir da verso 3, este comando foi alterado.


Utilize no lugar:

import org.opencv.imgcodecs.Imgcodecs;

Exemplo:
Imgcodecs.imencode(leExten, matrix, mob);

Unknown
26 de maio de 2017 14:06

No se usa mais o Highgui, os metodos dele foram para imgcodecs e


imgproc

10 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

Unknown
11 de janeiro de 2016 10:48

Amigo, esse cdigo serve para imagens limerializadas ?

Joo Paulo
22 de maro de 2016 09:55

O que esse eclipse

BlogTeste
23 de maro de 2017 13:25

quando a supelua ca minguante

Unknown
16 de agosto de 2016 08:00

Como ser o cdigo para reconhecimento dos olhos abertos e fechados, mas
no sendo em imagem e sim em vdeo?

Baby
13 de novembro de 2016 09:31

Classe main um erro System.loadLibrary(Core.NATIVE_LIBRARY_NAM);


run:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source
code - Erroneous tree type:
at main.Principal.main(Principal.java:30)
C:\Users\Maquinador Chefe\AppData\Local\NetBeans\Cache\8.1\executor-
snippets\run.xml:53: Java returned: 1
FALHA NA CONSTRUO (tempo total: 1 segundo)

11 de 12 08/06/2017 10:28
Java e OpenCv - Se divertindo com a deteco facial (Tutorial + Cdigo... http://onegocioeprogramar.blogspot.com.br/2014/05/java-e-opencv-se-...

desculpa se isso for um erro simples, mas preciso de ajuda nisso. Eu estou me
orientando pelo seu cdigo para desenvolver o meu. muito bem comentado o
seu cdigo, eu estou usando o Netbeans pra programar.

Mario Sergio
23 de novembro de 2016 12:15

J existem componentes prontos e de facil utilizao, olhe em


www.dvoz.org

Comentar como:

Publicar

Todos os direitos reservados O negcio programar

12 de 12 08/06/2017 10:28