Este artigo compartilha o código específico para Java realizar o reconhecimento facial por sua referência. O conteúdo específico é o seguinte
FILHO OFICIAL DO DOWNLOAD E INSTALAÇÃO, TEMPO WIN7 Como exemplo, faça o download do OpenCv-2.4.13.3-VC14.exe
Após a instalação, no diretório de compilação, no diretório de compilação, d:/opencv/build/java, obtenha OpenCV-2413.Jar, copie para o diretório do projeto e também requer o arquivo DLL e cada arquivo XML de reconhecimento para identificar diferentes recursos (face lateral, olhos, etc.)
Diretório DLL: d: /opencv/build/java/x64/opencv_java2413.dll
Diretório XML: d: /opencv/sources/data/haarcaScades/haarcascade_frontalface_alt.xml (existem vários arquivos de identificação no diretório)
Estrutura do projeto:
Código específico: como você precisa usar o arquivo DLL do OpenCV, ele pode ser colocado no caminho da biblioteca Java ou no JRE LIB. Ele pode ser colocado no diretório System32 no Windows, ou pode ser carregado dinamicamente no código, como segue:
pacote opencv; importação com.sun.sceNario.effect.Imagedata; importar org.opencv.core.*; importar org.opencv.core.point; importar org.opencv.highgui.highgui; importar org.opencv.imgproc.imgproc; importar org.opencv.objdetect.CASCADECLASSIFIER; importar javax.imageio.imageio; importar javax.swing.*; importar java.awt.*; importar java.awt.image.bufferiMage; importar java.io.file; importar java.io.ioException; importar java.util.arrays; importar java.util.Vector; /*** Criado pelo Administrador em 2017/8/17. */public class Test {static {// Importar OpenCV Library String OpenCV Path = System.getProperty ("User.dir") + "// OpenCV // x64 //"; String libpath = System.getProperty ("java.library.path"); String a = opencvpath + cor.native_library_name + ".dll"; System.Load (OpenCVPath + Core.native_library_name + ".dll"); } public static string getCutpath (string filepath) {string [] splitpath = filepath.split ("//."); Retornar Splitpath [0]+"Cut"+"."+Splitpath [1]; } Processo public static void (String original, String Target) lança Exceção {String originalcut = getCutPath (original); String TargetCut = getCutPath (Target); if (detectface (original, originalcut) && detectface (Target, TargetCut)) {}} public static boolean Detectface (String ImagePath, String outfile) lança exceção {System.out.println ("/nrunning detectFedFacedemo"); // Crie um reconhecedor de rosto a partir do arquivo de configuração lbpcascade_frontalface.xml, localizado no diretório de instalação do OpenCV. CascadeClassifier FACEDETECTER = NOVO CASCADECLASSIFIER ("c: //users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml"); Mat Image = Highgui.imread (ImagePath); // detecta faces na imagem matofrect facetections = new matofrect (); faceTeTector.DetectMultisCale (imagem, FaceTeCtions); System.out.println (string.format ("detectado %s faces", Facetection.toarray (). Comprimento)); Ret [] retts = facetection.toarray (); if (rets! = null && rects.length> 1) {lança a nova RUNTimeException ("mais de uma face"); } // Desenhe uma caixa em torno de cada face reconhecida Rect = Rects [0]; Core.Rectangle (imagem, novo ponto (ret.x-2, ret.y-2), novo ponto (rect.x + ret.width, ret.y + ret.height), novo escalar (0, 255, 0)); Mat sub = image.submat (ret); Mat mat = new Mat (); Tamanho do tamanho = novo tamanho (300, 300); Imgproc.resize (sub, mat, tamanho); // pesquise na face e salve o retorno highgui.imwrite (outfile, mat); // salve o resultado em um arquivo // string filename = "c: //users//administrator//desktop//opencv//facetetecção.png"; // system.out.println (string.format ("writing %s", nome do arquivo)); // highgui.imwrite (nome do arquivo, imagem); } public static void setAlpha (string imagepath, string outfile) { / *** Adicione itens de teste* Leia a imagem e desenhe -a em translúcido* / tente {imageicon imageicon = new Imageicon (imageath); BufferImage bufferImage = new bufferImage (imageicon.geticonwidth (), imageicon.geticonheight (), bufferiMage.type_4byte_abgr); Graphics2d G2D = (Graphics2d) bufferImage.getGraphics (); g2d.drawimage (imageicon.getImage (), 0, 0, imageicon.getImageObServer ()); // loop todos os pontos de pixels e altere o valor alfa do ponto de pixel int alfa = 100; for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) { for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) { int rgb = bufferedImage.getRGB(j2, j1); rgb = ((alfa + 1) << 24) | (RGB & 0x00FFFFFF); bufferImage.SetRGB (J2, J1, RGB); }} g2d.drawimage (bufferImage, 0, 0, imageicon.getImageObServer ()); // Gere a imagem como PNG imageio.write (bufferImage, "png", novo arquivo (outfile)); } catch (Exceção e) {e.printStackTrace (); }} marca d'água estática privada (string a, string b, string outfile, float alpha) lança ioexception {// obtenha o mapa base bufferImage buffimg = imageio.read (novo arquivo (a)); // Obtenha mapa de camada bufferImage waterImg = imageio.read (novo arquivo (b)); // Crie objeto Graphics2D e desenhe no mapa base Graphics2d g2d = buffimg.creategraphics (); int waterImgwidth = waterImg.getWidth (); // Obtenha largura do mapa da camada int waterImghEight = waterImg.getHeight (); // obtenha o mapa da camada altura // implemente a mistura e efeitos transparentes em gráficos e imagens G2D.SetComposite (alphacomposite.PetainStance (alphacomposite.sr. // desenhar g2d.drawimage (waterimg, 0, 0, waterimgwidth, waterimghight, nulo); g2d.dispose (); // libere os recursos do sistema usados no contexto gráfico // geram a imagem como png imageio.write (buffimg, "png", novo arquivo (outfile)); } public estático booleano Mergesimple (bufferImage image1, bufferImage image2, int posw, int posh, arquivo fileOutput) {// mescla duas imagens int w1 = image1.getwidth (); int h1 = image1.getHeight (); int w2 = image2.getwidth (); int h2 = image2.getHeight (); BufferImage imagensAved = new BufferImage (W1, H1, BufferImage.Type_Int_argb); Graphics2d g2d = imagensved.creategraphics (); // Adicione o código a seguir para tornar o plano de fundo G2D.DRAWIMAGE (Image1, NULL, 0, 0); Image1 = G2D.GetDeviceConfiguration (). CreateCompatibleImage (W1, W2, transparência.Translucent); g2d.dispose (); g2d = image1.creategraphics (); // Fim do código transparente de fundo // para (int i = 0; i <w2; i ++) {// for (int j = 0; j <h2; j ++) {// int rgb1 = image1.getrgb (i+posw, j+posh); // int rgb2 = image2.getRgb (i, j); // if (rgb1! = rgb2) {// // rgb2 = rgb1 & rgb2; //} // imagaved.setrgb (i + posw, j + Posh, rgb2); //} //} boolean b = false; tente {b = imageio.write (imagensved, "png", fileOutput); } catch (ioexception ie) {ie.printStackTrace (); } retornar b; } public static void main (string [] args) lança exceção {string a, b, c, d; a = "c: //users//administrator//desktop//opencv/zzzl.jpg"; d = "c: //users//administrator//desktop//opencv//cgx.jpg"; // processo (a, d); a = "c: //users//administrator//desktop//opencv//zzlcut.jpg"; d = "c: //users//administrator//desktop//opencv//cgxcut.jpg"; CascadeClassifier FACEDETECTER = NOVO CASCADECLASSIFIER ("c: //users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml"); CascadeClassifier EyedEtector1 = novo CascadeClassifier ("c: //users//administrator//desktop//opencv//haarcascade_eye.xml"); CascadeClassifier EYEDETECTOR2 = novo CascadeClassifier ("c: //users//administrator//desktop//opencv//haarcaScade_eye_tree_eyeglasses.xml"); Mat Image = highgui.imread ("c: //users//administrator//desktop//opencv//gakki.jpg"); // detectar FaceTeções na imagem Matofrect Facetections = new Matofrect (); //EYEDETECTOR2.DETECTMULTISCALE(IMAGE, FACEDETECÇÕES); Objetos de vetor <CRect>; EYEDETECTOR1.DETECTMULTISCALE (Imagem, Facetections, 2,0,1,1, novo tamanho (20.20), novo tamanho (20,20)); Ret [] retts = facetection.toarray (); Olho ret, olhob; olho = rets [0]; olhobb = scts [1]; System.out.println ("A-Center Coordenine" + Eye.x + "e" + Eye.y); System.out.println ("coordenada b-central" + olheb.x + "e" + EyeB.y); // Obtenha o ângulo de dois olhos duplo dy = (EyeB.y ea.y); duplo dx = (Eyeb.x-ea.x); duplo len = math.sqrt (dx*dx+dy*dy); System.out.println ("dx é"+dx); System.out.println ("dy is"+dy); System.out.println ("len é"+len); ângulo duplo = math.atan2 (math.abs (dy), math.abs (dx))*180.0/math.pi; System.out.println ("ângulo é"+ângulo); for (ret rect: FaceDeTectionS.ToArray ()) {Core.Rectangle (imagem, novo ponto (Rect.x, Rect.Y), novo ponto (Rect.x + ret.width, rect.y + ret.Height), novo escalar (0, 255, 0)); } String filename = "c: //users//administrator//desktop//opencv//ouput.png"; System.out.println (string.format ("writing %s", nome do arquivo)); Highgui.imwrite (nome do arquivo, imagem); // marca d'água (a, d, "c: //users//administrator//desktop//opencv//zzltm2.jpg", 0.7f); // // // // Leia a imagem sem alterar as informações originais da imagem // Mat Image1 = Highgui.imread (A); // Mat Image2 = Highgui.imread (D); // MAT MAT1 = new Mat (); Mat2 = new Mat (); // tamanho do tamanho = novo tamanho (300, 300); // imgproc.resize (imagem1, mat1, tamanho); // imgproc.resize (imagem2, mat2, tamanho); // MAT MAT3 = novo MAT (tamanho, cvtype.cv_64f); // Core.Addweighted (MAT1, 0,5, MAT2, 1, 0, MAT3); // // // // highgui.imwrite ("c: //users//administrator//desktop//opencv//add.jpg", mat3); // // Mergesimple (imageio.read (novo arquivo (a)), // imageio.read (novo arquivo (d)), 0,0, // novo arquivo ("c: //users//administrator//desktop//opencv//add.jpg"); }}Efeito final: há uma borda verde ao lado do rosto, e a imagem da borda verde pode ser capturada para gerar uma imagem de rosto
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.