java opencv识别图像是否是同一个人,贴完整代码
时间: 2023-11-19 16:04:19 浏览: 37
以下是一个基于Java和OpenCV的人脸识别代码示例:
```java
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.File;
import java.io.FilenameFilter;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
public class FaceRecognizer {
private static final String CASCADE_FILE = "haarcascade_frontalface_default.xml";
private static final String TRAINING_DIRECTORY = "training";
private static final int IMAGE_SIZE = 150;
private static final int NEIGHBORS = 5;
private static final double THRESHOLD = 100;
private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0);
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
CascadeClassifier faceDetector = new CascadeClassifier(CASCADE_FILE);
MatOfRect faceDetections = new MatOfRect();
File trainingDir = new File(TRAINING_DIRECTORY);
FilenameFilter pngFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".png");
}
};
File[] imageFiles = trainingDir.listFiles(pngFilter);
Mat[] images = new Mat[imageFiles.length];
int[] labels = new int[imageFiles.length];
int counter = 0;
for (File image : imageFiles) {
Mat img = Imgcodecs.imread(image.getAbsolutePath(), Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Imgproc.resize(img, img, new Size(IMAGE_SIZE, IMAGE_SIZE));
images[counter] = img;
labels[counter] = Integer.parseInt(image.getName().split("\\-")[0]);
counter++;
}
FaceRecognizer recognizer = org.opencv.face.Face.createLBPHFaceRecognizer(NEIGHBORS, 8, 8, 8, THRESHOLD);
recognizer.train(images, labels);
Mat testImage = Imgcodecs.imread("testing.png", Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Imgproc.resize(testImage, testImage, new Size(IMAGE_SIZE, IMAGE_SIZE));
faceDetector.detectMultiScale(testImage, faceDetections);
for (Rect rect : faceDetections.toArray()) {
Mat face = new Mat(testImage, rect);
Imgproc.resize(face, face, new Size(IMAGE_SIZE, IMAGE_SIZE));
int label = recognizer.predict(face);
Imgproc.rectangle(testImage, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), FACE_RECT_COLOR);
Imgproc.putText(testImage, String.valueOf(label), new Point(rect.x, rect.y - 5), Core.FONT_HERSHEY_PLAIN, 1.0, FACE_RECT_COLOR);
}
showResult(testImage);
}
private static void showResult(Mat image) {
MatOfByte matOfByte = new MatOfByte();
Imgcodecs.imencode(".jpg", image, matOfByte);
byte[] byteArray = matOfByte.toArray();
BufferedImage bufImage = null;
try {
bufImage = ImageIO.read(new ByteArrayInputStream(byteArray));
} catch (IOException e) {
e.printStackTrace();
}
JFrame frame = new JFrame("Face Recognizer");
frame.getContentPane().setLayout(null);
JLabel lbl = new JLabel();
lbl.setBounds(0, 0, bufImage.getWidth(), bufImage.getHeight());
Image img = new ImageIcon(byteArray).getImage();
Image scaledImg = img.getScaledInstance(lbl.getWidth(), lbl.getHeight(), Image.SCALE_SMOOTH);
lbl.setIcon(new ImageIcon(scaledImg));
frame.getContentPane().add(lbl);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
```
在此代码中,我们使用OpenCV的CascadeClassifier来检测图像中是否有人脸。然后,我们将检测到的人脸裁剪并调整为固定大小,以便进行识别。
我们使用OpenCV的FaceRecognizer来训练人脸识别器,并将其应用于测试图像中检测到的每个人脸。如果测试图像中的人脸与训练数据中的任何人脸都非常相似,则识别器将返回相应的标签。我们在测试图像上绘制矩形来标记检测到的人脸,并将其标签附加到矩形上。
最后,我们使用Java Swing将结果显示在一个窗口中。
请注意,此代码仅用于演示目的,并且可能需要按照您的要求进行更改。例如,您可以使用不同的算法(如Eigenfaces或Fisherfaces)来训练人脸识别器。