Nhận diện khuôn mặt sử dụng OpenCV trong Java

Nhận diện khuôn mặt sử dụng OpenCV trong Java (Face Detection) là một lĩnh vực nghiên cứu của ngành Computer Vision, thư viện OpenCV cung cấp API giúp nhận diện khuôn mặt dễ dàng, hãy cùng tìm hiểu phương thức nhận diện khuôn mặt sử dụng OpenCV thông qua ví dụ cụ thể.

Hệ thống nhận dạng khuôn mặt giúp tự động xác định hoặc nhận dạng một người nào đó từ một bức hình ảnh kỹ thuật số hoặc một khung hình từ một nguồn video bằng cách so sánh các đặc điểm khuôn mặt chọn trước từ hình ảnh và một cơ sở dữ liệu đã được thu thập trước, vậy chúng ta đi làm trước đầu tiên là nhận diện khuôn mặt.

Sau đây là phần hướng dẫn giúp các bạn xử lý lhận diện khuôn mặt sử dụng OpenCV trong Java, bạn có thể xem thêm một số bài viết dưới đây để thực hiện tải hình ảnh hoặc video sử dụng thư viện OpenCV.

Xem thêm:

Khởi chạy ứng dụng OpenCV đầu tiên

Hiển thị hình ảnh sử dụng OpenCV trong Java

Hiển thị máy ảnh sử dụng OpenCV trong Java

Bước 1: Tải thư viện OpenCV vào dự án

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

Hoặc bạn có thể nạp thư viện OpenCV bằng đường dẫn chẳng hạn

System.load("C:\\OpenCV\\build\\java\\x64\\opencv_java341.dll");

Bước 2: Khởi tạo lớp CascadeClassifier thuộc gói org.opencv.objdetect, lớp CascadeClassifier sử dụng để nạp các tập tin cần thiết đẻ xử lý bằng cách nạp tập tin định dạng xml với tên lbpcascade_frontalface.xml

String xmlFile = "C:\\OpenCV\\sources\\data\\haarcascades_cuda\\haarcascade_frontalface_alt.xml"; 
CascadeClassifier classifier = new CascadeClassifier(xmlFile);

Các tập tin XML bạn có thể tìm thấy ở đường dẫn cài đặt OpenCV

Bước 3: Đoạn mã chương trình sau đây sẽ giúp nhận diện khuôn mặt sử dụng OpenCV trong Java

package com.teamvietdev.facedetection;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
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.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;

/**
 *
 * @author TVD
 */
public class JavaCVFaceDetection {

    static CascadeClassifier faceDetector = null;

    private static Mat findFaceDetection(Mat image) {
        MatOfRect faceDetections = new MatOfRect();
        faceDetector.detectMultiScale(image, faceDetections);
        for (Rect rect : faceDetections.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));
        }
        return image;
    }

    private static BufferedImage matToBufferedImage(Mat matrix) {
        try {
            MatOfByte mob = new MatOfByte();
            Imgcodecs.imencode(".jpg", matrix, mob);
            byte ba[] = mob.toArray();
            BufferedImage bufferedImage = ImageIO.read(new ByteArrayInputStream(ba));
            return bufferedImage;
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) throws Exception {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//        System.load("C:\\OpenCV\\build\\java\\x64\\opencv_java341.dll");

        faceDetector = new CascadeClassifier();
        faceDetector.load("C:\\OpenCV\\sources\\data\\haarcascades_cuda\\haarcascade_frontalface_alt.xml");

        Mat mat = Imgcodecs.imread("X:\\tayduky.jpg");
        
        findFaceDetection(mat);

        JFrame frame = new JFrame();
        frame.getContentPane().add(new JLabel(new ImageIcon(matToBufferedImage(mat))));
        frame.pack();
        frame.setTitle("Examples JavaCV");
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}

Kết quả sau khi chạy đoạn mã chương trình trên:

Nhận diện khuôn mặt sử dụng OpenCV trong Java

Lời kết: Bạn vừa theo dõi phần hướng dẫn hiển thị máy ảnh sử dụng OpenCV, ở các bài viết kế tiếp chúng ta sẽ tìm hiểu thêm như cách hiển thị video sử dụng OpenCV, nhận dạng khuôn mặt sử dụng OpenCV… được chia sẻ miễn phí tại Team Việt Dev trong chuyên mục OpenCV.

(Tác giả: Team Việt Dev)

6 Comments

  1. Nguyen Vu Tho 17/01/2019 Reply
  2. Trọng 20/05/2019 Reply
    • admin 23/05/2019 Reply
  3. Nam Hoàng Nguyễn 26/08/2019 Reply
  4. Trần Quang Đạo 03/10/2019 Reply

Bình luận