この記事では、Javaの特定のコードを共有して、参照に対する顔の認識を実現します。特定のコンテンツは次のとおりです
公式ダウンロードとインストールファイル、win7を例に取り、opencv-2.4.13.3-vc14.exeをダウンロードしてください
インストール後、ビルドディレクトリ、ビルドディレクトリ、d:/opencv/build/java、opencv-2413.jarを取得し、プロジェクトディレクトリにコピーし、DLLファイルと各認識XMLファイルも必要です。
dllディレクトリ:d:/opencv/build/java/x64/opencv_java2413.dll
XMLディレクトリ:d:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml(ディレクトリにはさまざまな識別ファイルがあります)
プロジェクト構造:
特定のコード:OpenCVのDLLファイルを使用する必要があるため、JavaライブラリパスまたはJRE LIBに配置できます。 Windowsの下のSystem32ディレクトリに配置することも、次のようにコードに動的にロードすることもできます。
パッケージopencv; com.sun.scenario.effect.imagedataをインポートします。 org.opencv.core。*; Import org.opencv.core.point; org.opencv.highgui.highguiをインポートします。 Import org.opencv.imgproc.imgproc; org.opencv.objdetect.cascadeclassifierをインポートします。 javax.imageio.imageioをインポートします。 javax.swing。*; java.awt。*; java.awt.image.bufferedimageをインポートします。 java.io.fileをインポートします。 java.io.ioexceptionをインポートします。 java.util.arraysをインポートします。 java.util.vectorをインポートします。 /*** 2017/8/17に管理者によって作成されました。 */public class test {static {// opencv library string opencv path = system.getProperty( "user.dir") + "// opencv // x64 //"; string libpath = system.getProperty( "java.library.path");文字列a = opencvpath + core.native_library_name + ".dll"; system.load(opencvpath + core.native_library_name + ".dll"); } public static string getCutPath(string filepath){string [] splitpath = filepath.split( "//。"); splitpath [0]+"cut"+"。"+splitpath [1]を返します。 } public static void Process(string original、string target)スロー例外{string originalcut = getCutPath(original); string targetcut = getCutPath(ターゲット); if(detectface(original、originalcut)&& detectface(target、targetcut)){}} public static boolean detectface(string imagepath、string outfile)throws {system.out.println( "/nrunning detectfacedemo"); //構成ファイルlbpcascade_frontalface.xmlからフェイス認識者を作成します。これは、opencvインストールディレクトリにあります。 cascadeclassifier faceDeTector = new CascadeClassifier( "c://users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml");マット画像= highgui.imread(imagepath); //画像内の顔を検出するfacedetections = new MatofRect(); FACEDETECTOR.DETECTMULTISCALE(画像、FACEDETECTIONS); system.out.println(string.format( "検出された%s faces"、facedeTections.toarray()。長さ)); rect [] rects = facedetections.toarray(); if(rects!= null && rects.length> 1){新しいruntimeexception( "複数の顔を超える"); } //認識されている各顔の周りにボックスを描画しますrect = rects [0]; core.rectangle(画像、新しいポイント(rect.x-2、rect.y-2)、new point(rect.x + rect.width、rect.y + rect.height)、new Scalar(0、255、0)); mat sub = image.submat(rect);マットマット= new Mat();サイズサイズ= newサイズ(300、300); imgproc.resize(sub、mat、size); // faceを検索して、highgui.imwrite(outfile、mat)を保存します。 //結果をファイルに保存します// system.out.println(string.format( "writing%s"、filename)); // highgui.imwrite(filename、image); } public static void setalpha(string imagepath、string outfile){ / ***テスト項目の追加*画像を読み取り、透明* / try {imageicon imageicon = new ImageIcon(ImagePath); bufferedimage bufferedimage = new bufferedimage(ImageIcon.getIconWidth()、ImageIcon.geticonHeight()、BufferedImage.type_4byte_abgr); Graphics2d g2d =(graphics2d)bufferedimage.getgraphics(); g2d.drawimage(imageIcon.getImage()、0、0、ImageIcon.getImageObServer()); //すべてのピクセルポイントをループし、ピクセルポイントのアルファ値を変更しますint alpha = 100; for(int j1 = bufferedimage.getminy(); j1 <bufferedimage.getheigh(); j1 ++){for(int j2 = bufferedimage.getminx(); j2 <bufferedimage.getWidth(); j2 ++){int rgb = bufferedimage.getrgb(j2(j1); rgb =((alpha + 1)<< 24)| (rgb&0x00ffffff); bufferedimage.setrgb(j2、j1、rgb); }} g2d.drawimage(bufferedimage、0、0、imageicon.getimageobserver()); // png imageio.writeとして画像を生成する(bufferedimage、 "png"、new file(outfile)); } catch(Exception e){e.printstacktrace(); }} private static voidウォーターマーク(String A、String B、String Outfile、Float Alpha)IoException {//ベースマップBufferedImage buffimg = imageio.read(new file(a)); //レイヤーマップbufferedimage waterimg = imageio.read(new file(b)); // Graphics2Dオブジェクトを作成し、ベースマップオブジェクトグラフィック2D g2d = buffimg.creategraphics()を描画します。 int waterimgwidth = waterimg.getWidth(); //レイヤーマップ幅を取得するint waterimgheight = waterimg.getheight(); //グラフィックスと画像にミキシングと透明な効果を実装します。 // g2d.drawimage(waterimg、0、0、waterimgwidth、waterimgheight、null)を描く; g2d.dispose(); //グラフィックコンテキストで使用されるシステムリソースをリリースします} public static boolean mergesimple(bufferedimage image1、bufferedimage image2、int posw、int posh、fileoutput){// 2つの画像をマージint w1 = image1.getWidth(); int h1 = image1.getheight(); int w2 = image2.getWidth(); int h2 = image2.getheight(); BufferedImage ImagesAved = new BufferedImage(W1、H1、BuffereDIMAGE.TYPE_INT_ARGB); graphics2d g2d = imagesaved.creategraphics(); //次のコードを追加して、バックグラウンドを透明にするG2D.drawimage(Image1、null、0、0)を透過的にします。 image1 = g2d.getDeviceConfiguration()。createCompatibleImage(w1、w2、transparency.translucent); g2d.dispose(); g2d = image1.creategraphics(); //バックグラウンドの終了透過コード//(int i = 0; i <w2; i ++){//(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; //} // imagesaved.setRgb(i + posw、j + posh、rgb2); //} //} boolean b = false; try {b = imageio.write(imagesaved、 "png"、fileoutput); } catch(ioexception ie){ie.printstacktrace(); } burten b; } public static void main(string [] args)スロー例外{string a、b、c、d; a = "c://users//administrator//desktop//opencv//zzl.jpg"; d = "c://users//administrator//desktop//opencv//cgx.jpg"; // process(a、d); a = "c://users//administrator//desktop//opencv//zzlcut.jpg"; d = "c://users//administrator//desktop//opencv//cgxcut.jpg"; cascadeclassifier faceDeTector = new CascadeClassifier( "c://users//administrator//desktop//opencv//haarcascade_frontalface_alt.xml"); cascadeclassifier Eyedetector1 = new CascadeClassifier( "c://users//administrator//desktop//opencv//haarcascade_eye.xml"); cascadeclassifier eyedetector2 = new cascadeclassifier( "c://users//administrator//desktop//opencv//haarcascade_eye_tree_eyeglasses.xml");マット画像= highgui.imread( "c://users//administrator//desktop//opencv//gakki.jpg"); //画像のFACEDETECTIONSを検出するMATOFRECT FACEDETECTIONS = NEW MATOFRECT(); //EYEDETECTOR2.DETECTMULTISCALE(IMAGE、FACEDETECTIONS); Vector <Rect>オブジェクト; EyeDetector1.DetectMultiscale(画像、FaceDeTections、2.0、1,1、新しいサイズ(20,20)、新しいサイズ(20,20)); rect [] rects = facedetections.toarray();長い目、アイブ; eye = rects [0]; eyeb = rects [1]; System.out.println( "a-center座標" + eye.x + "および" + eye.y); System.out.println( "b-center座標" + eyeb.x + "および" + eyeb.y); // 2つの目の角度を取得しますdy =(eyeb.y-eyea.y); double dx =(eyeb.x-eyea.x); double len = math.sqrt(dx*dx+dy*dy); System.out.println( "dx is"+dx); system.out.println( "dy is"+dy); System.out.println( "len is"+len); double angle = math.atan2(math.abs(dy)、math.abs(dx))*180.0/math.pi; System.out.println( "angle is"+angle); for(rect rect:facedetections.toarray()){core.rectangle(image、new point(rect.x、rect.y)、new point(rect.x + rect.width、rect.y + rect.height)、new Scalar(0、255、0)); } string filename = "c://users//administrator//desktop//opencv//out.png"; System.out.println(string.format( "writing%s"、filename)); highgui.imwrite(filename、image); //ウォーターマーク(a、d、 "c://users//administrator//desktop//opencv//zzltm2.jpg"、0.7f); // // // //画像の元の情報を変更せずに画像を読む// mat image1 = highgui.imread(a); // mat image2 = highgui.imread(d); // mat mat1 = new Mat();マットマット= new Mat(); //サイズサイズ=新しいサイズ(300、300); // imgproc.resize(image1、mat1、size); // imgproc.resize(image2、mat2、size); // MAT MAT3 =新しいマット(サイズ、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(new file(a))、// imageio.read(new file(d))、0,0、// new file( "c://users/administrator//desktop//opencv//add.jpg")); }}最終的な効果:顔の隣に緑の境界線があり、緑色の境界の画像をキャプチャして顔の画像を生成できます
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。