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);
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:
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)
Khi sử dụng lại src này em chạy đang bị lổi penCV Error: Unspecified error (could not find encoder for the specified extension) in cv::imencode, file C:\Users\Bryan\Documents\Developer\opencv-3.2.0\modules\imgcodecs\src\loadsave.cpp, line 682
Exception in thread “main” CvException [org.opencv.core.CvException: cv::Exception: C:\Users\Bryan\Documents\Developer\opencv-3.2.0\modules\imgcodecs\src\loadsave.cpp:682: error: (-2) could not find encoder for the specified extension in function cv::imencode
]
at org.opencv.imgcodecs.Imgcodecs.imencode_1(Native Method)
at org.opencv.imgcodecs.Imgcodecs.imencode(Imgcodecs.java:142)
at test.JavaCVFaceDetection.matToBufferedImage(JavaCVFaceDetection.java:42)
at test.JavaCVFaceDetection.main(JavaCVFaceDetection.java:63)
Bạn clearn project lại xem sao.
anh có cách nào so sánh 2 khuôn mặt không ạ bằng open cv và code java không ạ ?
Phân này thì mình phải làm dạng cho máy học ảnh gốc, so sánh như mắt, mũi, miệng…
em thử chạy nhưng không được. em mới học về open cv
Anh ơi có thể cho em xin code cho phép máy ảnh của window và nhận diện trực tiếp khuôn mặt của mình trên đó ko ạ