Artificial Intelligence 25 min read

Integrating OpenCV with Java and Spring Boot for Face Detection and Recognition

This guide provides a comprehensive walkthrough of installing OpenCV, using its Java API for image and video face detection, implementing face comparison, creating custom GUI windows, and integrating the library into a Spring Boot application with detailed code examples and common troubleshooting tips.

Selected Java Interview Questions
Selected Java Interview Questions
Selected Java Interview Questions
Integrating OpenCV with Java and Spring Boot for Face Detection and Recognition

Overview

OpenCV is an open‑source computer‑vision library released under the BSD license. It offers C++, Python, and Java interfaces and runs on Windows, Linux, macOS, iOS, and Android.

Download and Installation

Download the latest release from opencv.org . After extracting, run the installer in the build directory. The sources folder contains the source code.

Directory Structure

The key directories are:

build   // Windows build output
sources // Open source code

For Java development, focus on the opencv-460.jar file located in the java sub‑directory.

Basic Usage in Java

Official documentation and tutorials can be found at:

OpenCV Docs

Chinese Docs

W3CSchool Tutorial

Project Integration

In IntelliJ IDEA, add opencv-460.jar to the project libraries (Ctrl+Shift+Alt+S → Libraries). Alternatively, install the JAR to a local Maven repository and declare it as a dependency in pom.xml .

Image Face Detection Example

public static void main(String[] args) {
    imageFaceDetection();
}
/**
 * Image face detection
 */
public static void imageFaceDetection() {
    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    CascadeClassifier faceDetector = new CascadeClassifier("D:\\Development\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");
    String imgPath = "D:\\user\\test.png";
    Mat image = Imgcodecs.imread(imgPath);
    if (image.empty()) {
        throw new RuntimeException("图片内存为空");
    }
    MatOfRect face = new MatOfRect();
    faceDetector.detectMultiScale(image, face);
    Rect[] rects = face.toArray();
    System.out.println("识别人脸个数: " + rects.length);
    int i = 1;
    for (Rect rect : face.toArray()) {
        Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0,255,0), 3);
        imageCut(imgPath, "D:\\user\\" + i + ".jpg", rect.x, rect.y, rect.width, rect.height);
        i++;
    }
    Imgcodecs.imwrite("D:\\user\\test1.png", image);
    HighGui.imshow("人脸识别", image);
    HighGui.waitKey(0);
}

Face Comparison (Similarity)

The following method compares two face images using histogram correlation:

public static double faceRecognitionComparison(String image1, String image2) {
    Mat mat1 = conv_Mat(image1);
    Mat mat2 = conv_Mat(image2);
    Mat mat3 = new Mat();
    Mat mat4 = new Mat();
    MatOfFloat ranges = new MatOfFloat(0f, 256f);
    MatOfInt histSize = new MatOfInt(1000);
    Imgproc.calcHist(Arrays.asList(mat1), new MatOfInt(0), new Mat(), mat3, histSize, ranges);
    Imgproc.calcHist(Arrays.asList(mat2), new MatOfInt(0), new Mat(), mat4, histSize, ranges);
    return Imgproc.compareHist(mat3, mat4, Imgproc.CV_COMP_CORREL);
}

Typical results: a score of 1.0 indicates a perfect match, while lower scores indicate dissimilarity.

Video Face Recognition

Capture frames from a video file, detect faces, draw rectangles, and display the result in real time.

VideoCapture capture = new VideoCapture();
capture.open("D:\\user\\test.mp4");
while (capture.isOpened()) {
    capture.read(video);
    HighGui.imshow("视频识别人脸", getFace(video));
    if (HighGui.waitKey(100) == 27) { // ESC key
        capture.release();
        break;
    }
}

Camera Face Recognition

Open the default webcam (device 0), read frames, detect faces, and optionally save snapshots.

VideoCapture videoCapture = new VideoCapture(0);
if (!videoCapture.isOpened()) throw new Exception("摄像头不存在");
while (true) {
    videoCapture.read(video);
    HighGui.imshow("实时人脸识别", getFace(video));
    if (HighGui.waitKey(50) == 27) {
        videoCapture.release();
        break;
    }
}

Custom Swing Window

Because OpenCV’s HighGUI offers limited UI controls, a custom Swing window can display the video stream and perform face detection.

public class MyJPanel extends JPanel {
    private BufferedImage mImg;
    public void paintComponent(Graphics g) {
        if (mImg != null) g.drawImage(mImg, 0, 0, mImg.getWidth(), mImg.getHeight(), this);
    }
    // cameraFaceRecognition() creates a JFrame, captures frames, draws faces, and updates the panel.
}

Spring Boot Integration

Add the usual Spring Boot starters, Lombok, and FastJSON dependencies. Include the OpenCV JAR in the project and configure application.yml with the paths to the cascade XML files for Windows and Linux.

opencv:
  lib:
    linuxxmlpath: /usr/local/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml
    windowxmlpath: D:\Development\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml

Set the JVM option -Djava.library.path=... to point to the native OpenCV libraries, and disable headless mode for GUI components:

SpringApplicationBuilder builder = new SpringApplicationBuilder(FaceOpenCvApplication.class);
builder.headless(false).run(args);

Common Exceptions and Fixes

UnsatisfiedLinkError : Ensure opencv_java460.dll is on the library path or copy it to %JAVA_HOME%/bin or the application directory.

HeadlessException : Disable headless mode via .setHeadless(false) or JVM argument -Djava.awt.headless=false .

ClassLoader conflicts : Restart Tomcat after changing library paths, or clean the project to avoid duplicate loading.

Following these steps enables a fully functional Java‑based face detection and recognition system, both as a standalone application and as a Spring Boot web service.

Javacomputer visionSpring Bootopencvface detectionvideo captureCustom GUI
Selected Java Interview Questions
Written by

Selected Java Interview Questions

A professional Java tech channel sharing common knowledge to help developers fill gaps. Follow us!

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.