OPENCV+JAVA 얼굴 인식 실현
공식 다운로드파일 설치win 7 의 경우 opencv-2.4.13.3-vc14.exe 를 다운로드 합 니 다.
설치 후 build 디 렉 터 리 아래 D:\opencv\build\자바,opencv-2413.jar,copy 를 프로젝트 디 렉 터 리 로 가 져 옵 니 다.
또한 dll 파일 과 각 xml 파일 을 식별 하여 서로 다른 특징 을 식별 해 야 합 니 다(얼굴,옆 모습,눈 등)
dll 디 렉 터 리:D:\\opencv\build\java\x64\\opencvjava2413.dll
xml 디 렉 터 리:D:\\opencv\\sources\data\\haarcascades\\haarcascadefrontalface_alt.xml(디 렉 터 리 에 각종 식별 파일 이 있 음)
프로젝트 구성:
구체 적 인 코드:opencv 의 dll 파일 을 사용 해 야 하기 때문에 자바 library path 에 두 거나 jre lib 에 두 거나 windows 아래 는 System 32 디 렉 터 리 에 두 거나 코드 에 동적 으로 불 러 올 수 있 습 니 다.다음 과 같 습 니 다.
package opencv;
import com.sun.scenario.effect.ImageData;
import org.opencv.core.*;
import org.opencv.core.Point;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Vector;
/**
* Created by Administrator on 2017/8/17.
*/
public class Test {
static{
// opencv
String opencvpath = System.getProperty("user.dir") + "\\opencv\\x64\\";
String libPath = System.getProperty("java.library.path");
String 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("\\.");
return splitPath[0]+"Cut"+"."+splitPath[1];
}
public static void process(String original,String target) throws Exception {
String originalCut = getCutPath(original);
String targetCut = getCutPath(target);
if(detectFace(original,originalCut) && detectFace(target,targetCut)){
}
}
public static boolean detectFace(String imagePath,String outFile) throws Exception
{
System.out.println("
Running DetectFaceDemo");
// lbpcascade_frontalface.xml , opencv
CascadeClassifier faceDetector = new CascadeClassifier(
"C:\\Users\\Administrator\\Desktop\\opencv\\haarcascade_frontalface_alt.xml");
Mat image = Highgui.imread(imagePath);
//
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces",
faceDetections.toArray().length));
Rect[] rects = faceDetections.toArray();
if(rects != null && rects.length > 1){
throw new RuntimeException(" ");
}
//
Rect rect = rects[0];
Core.rectangle(image, new Point(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);
Mat mat = new Mat();
Size size = new Size(300, 300);
Imgproc.resize(sub, mat, size);//
return Highgui.imwrite(outFile, mat);
//
// String filename = "C:\\Users\\Administrator\\Desktop\\opencv\\faceDetection.png";
// 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());
// , Alpha
int alpha = 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 = ( (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 watermark(String a,String b,String outFile, float alpha) throws IOException {
//
BufferedImage buffImg = ImageIO.read(new File(a));
//
BufferedImage waterImg = ImageIO.read(new File(b));
// Graphics2D ,
Graphics2D g2d = buffImg.createGraphics();
int waterImgWidth = waterImg.getWidth();//
int waterImgHeight = waterImg.getHeight();//
//
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
//
g2d.drawImage(waterImg, 0, 0, waterImgWidth, waterImgHeight, null);
g2d.dispose();//
// PNG
ImageIO.write(buffImg, "png", new File(outFile));
}
public static boolean mergeSimple(BufferedImage image1, BufferedImage image2, int posw, int posh, File fileOutput) {
//
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();
//
// for (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;
// }
// imageSaved.setRGB(i + posw, j + posh, rgb2);
// }
// }
boolean b = false;
try {
b = ImageIO.write(imageSaved, "png", fileOutput);
} catch (IOException ie) {
ie.printStackTrace();
}
return b;
}
public static void main(String[] args) throws Exception {
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");
Mat image = Highgui.imread("C:\\Users\\Administrator\\Desktop\\opencv\\gakki.jpg");
//
MatOfRect faceDetections = new MatOfRect();
//eyeDetector2.detectMultiScale(image, faceDetections);
Vector<Rect> objects;
eyeDetector1.detectMultiScale(image, faceDetections, 2.0,1,1,new Size(20,20),new Size(20,20));
Rect[] rects = faceDetections.toArray();
Rect eyea,eyeb;
eyea = rects[0];eyeb = rects[1];
System.out.println("a- " + eyea.x + " and " + eyea.y);
System.out.println("b- " + eyeb.x + " and " + eyeb.y);
//
double 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\\ouput.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
// watermark(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();Mat mat2 = new Mat();
// Size size = new Size(300, 300);
// Imgproc.resize(image1, mat1, size);
// Imgproc.resize(image2, mat2, size);
// Mat mat3 = new Mat(size,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"));
}
}
최종 효과:사람의 얼굴 옆 에 녹색 테두리 가 있어 녹색 테두리 그림 을 캡 처 하여 사람의 얼굴 그림 을 생 성 할 수 있 습 니 다.이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
OPENCV+JAVA 얼굴 인식 실현본 논문 의 사례 는 JAVA 가 사람의 얼굴 인식 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다. 설치 후 build 디 렉 터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.