Java+OpenCV实现图片中的人脸识别攻略
简介
OpenCV是一组用于计算机视觉的开源库,提供许多常用的计算机视觉算法和工具。它支持多种编程语言,包括 Java。本文介绍如何使用Java和OpenCV来实现图片中的人脸识别。
编译环境
- 开发环境:Eclipse
- Java版本:Java 8
- OpenCV版本:OpenCV 3.4.3
安装OpenCV
- 下载OpenCV 3.4.3的Java版本库。
- 解压缩下载的库文件到本地目录。
- 在Eclipse中创建一个Java项目。
- 将解压后的
opencv-343.jar
文件拷贝至Java项目的libs目录下。 - 将解压后的
opencv-343.jar
文件添加到Java Build Path中。
加载图像并进行人脸识别
下面是一个简单的代码示例,用于加载一张图片并进行人脸识别。这里我们使用的是OpenCV自带的人脸识别分类器(haarcascade_frontalface_default.xml
)。
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
public class TestFaceDetection {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat image = Imgcodecs.imread("test.jpg");
CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_default.xml");
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
for (Rect rect : faceDetections.toArray()) {
Imgproc.rectangle(image, new org.opencv.core.Point(rect.x, rect.y), new org.opencv.core.Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0,255,0));
}
Imgcodecs.imwrite("result.jpg", image);
}
}
运行程序后,会在控制台输出检测到的人脸数量,并将检测到的人脸在原图上用矩形框出,并保存为result.jpg
文件。
更多示例
下面是一个更完整的Java代码示例,用于加载一张本地图片并进行人脸识别。在处理图片时,我们先将图片缩放到一个较小的尺寸(比如400x300),然后再进行人脸识别,以提高识别效率。
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import org.apache.commons.io.FileUtils;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
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 TestFaceDetection {
static {
// Load OpenCV library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public static void main(String[] args) {
int minFaceSize = 40;
String inputPath = "input.jpg";
String outputPath = "output.jpg";
try {
// Load input image
Mat inputImage = Imgcodecs.imread(inputPath);
// Resize to smaller size if necessary
double scaleFactor = Math.min(1.0, 400.0 / inputImage.width());
if (scaleFactor < 1.0) {
Size newSize = new Size(inputImage.width() * scaleFactor, inputImage.height() * scaleFactor);
Imgproc.resize(inputImage, inputImage, newSize);
}
// Detect faces
CascadeClassifier faceDetector = new CascadeClassifier("haarcascade_frontalface_default.xml");
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(inputImage, faceDetections, 1.1, 3, 0, new Size(minFaceSize,minFaceSize), inputImage.size());
// Draw rectangles around detected faces
Rect[] faceRects = faceDetections.toArray();
for (int i = 0; i < faceRects.length; i++) {
Rect r = faceRects[i];
Imgproc.rectangle(inputImage, r.tl(), r.br(), new Scalar(0, 0, 255), 3);
}
// Save output image
Imgcodecs.imwrite(outputPath, inputImage);
} catch (Exception e) {
e.printStackTrace();
}
}
}
这个示例中,我们使用了Apache Commons IO库中的FileUtils类来读写文件。我们还实现了一个minFaceSize
变量,用于指定识别的最小人脸大小。如果图像中的人脸大小小于该值,则不会被检测到。
当程序运行完成后,它会读取input.jpg
文件,并将检测到的人脸用红色矩形框出,并保存为output.jpg
文件。
总之,这就是使用Java和OpenCV实现人脸识别的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java+OpenCV实现图片中的人脸识别 - Python技术站