All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.anlavn.opencv.FaceDetection Maven / Gradle / Ivy

There is a newer version: 6.70.10.2
Show newest version
package com.anlavn.opencv;
// Make By Bình An || AnLaVN || KatoVN

import com.anlavn.file.Log;
import com.anlavn.file.NativeLibrary;
import com.anlavn.file.Zip;
import com.anlavn.net.DocNet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import static org.opencv.imgproc.Imgproc.rectangle;
import static org.opencv.imgcodecs.Imgcodecs.imencode;
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.objdetect.CascadeClassifier;
import org.opencv.videoio.VideoCapture;

/**Lớp FaceDetection hỗ trợ nhận diện khuôn mặt bằng thư viện thị giác máy tính lớn nhất thế giới - OpenCV.
 * @author AnLaVN
 */
public final class FaceDetection {
    private static boolean DetectFace = false;
    private static JPanel panCam = null;
    private static int BorderRadius = 0, Thickness = 2, width = 0, height = 0;
    private static final String XML_PATH = "FaceDetection/FaceDetection.xml", 
                                DLL32_PATH = "FaceDetection/opencv_java460_32.dll", 
                                DLL64_PATH = "FaceDetection/opencv_java460_64.dll";
    private static File xmlFaceDetection = null;
    private static DaemonThread myThread = null;
    private static VideoCapture webSource = null;
    private static Mat frame = null;
    private static MatOfByte mem = null;
    private static CascadeClassifier faceDetector = null;
    private static MatOfRect faceDetections = null;
    private static BufferedImage buff;
    private static Scalar scalar = new Scalar(0, 255,0);
    private static class DaemonThread implements Runnable {
        protected volatile boolean runnable = false;
        @Override public void run() { synchronized (this) {
            RoundRectangle2D.Double panBoder = new RoundRectangle2D.Double(0, 0, width, height, BorderRadius, BorderRadius);
            while (runnable) {  if (webSource.grab()) {
                try {
                    webSource.retrieve(frame);
                    Graphics g = panCam.getGraphics();
                    if(DetectFace){
                        faceDetector.detectMultiScale(frame, faceDetections);
                        for (Rect rect : faceDetections.toArray()) {
                            rectangle(frame, 
                                      new Point(rect.x, rect.y), 
                                      new Point(rect.x + rect.width, rect.y + rect.height), 
                                      scalar, Thickness);}}
                    imencode(".bmp", frame, mem);
                    Image im = ImageIO.read(new ByteArrayInputStream(mem.toArray()));
                    buff = (BufferedImage) im;
                    Graphics2D g2 = (Graphics2D) g;
                    g2.setClip(panBoder);
                    g.drawImage(buff, 0, 0, width, height, 0, 0, buff.getWidth(), buff.getHeight(), null);
                    if (runnable == false) {    this.wait();    }}
                catch (IOException | InterruptedException ex) { 
                    Log.add("!!! Error trying to Face Detection. !!!\n" + ex.toString());
                }
            }}}}}
    private static void loadXMLFile()   throws FileNotFoundException{
        xmlFaceDetection = new File(XML_PATH);
        if(!xmlFaceDetection.exists())  throw new FileNotFoundException("File not found \"" + XML_PATH + "\".");
    }
    private static void loadDLLFile()   throws FileNotFoundException{
        String bitLib = System.getProperty("sun.arch.data.model");
        Log.add("Face Detection Module - Load Computer architecture: " + bitLib + "-bit computing.");
        bitLib = bitLib.equals("64") ? DLL64_PATH : DLL32_PATH;
        if(!new File(bitLib).exists())  throw new FileNotFoundException("File not found \"" + bitLib + "\".");
        NativeLibrary.load(bitLib);
        Log.add("Face Detection Module - Load Native Library \"" + bitLib + "\" successfully.");
    }
    private static boolean isLoad(){
        return frame!=null && mem!=null && faceDetector!=null && faceDetections!=null && panCam!=null;
    }
    /**Sử dụng phương thức này để tải Module hỗ trợ nhận diện khuôn mặt.
* Chạy phương thức này trước. * @see FaceDetection#setDetectPanel(javax.swing.JPanel) * @see FaceDetection#setDetectPanel(javax.swing.JPanel, int) */ public static final void loadModule(){ try{ loadXMLFile(); loadDLLFile(); }catch(FileNotFoundException e){ Log.add("!!! Error try to Face Detection: No module FaceDetection, trying to download it. !!!"); try { if(!new File("FaceDetection.zip").exists()) new DocNet("https://github.com/AnLaVN/AL-Library/releases/download/v3.68.11/FaceDetection.zip").saveAs("FaceDetection.zip"); Zip.Extract("FaceDetection.zip", ""); loadXMLFile(); loadDLLFile(); } catch (IOException ex) { Log.add("!!! Error try to Face Detection: Can not download module FaceDetection. Please check your connecttion. !!!\n\t\tError code: " + e.toString()); System.exit(0); } } frame = new Mat(); mem = new MatOfByte(); faceDetector = new CascadeClassifier(xmlFaceDetection.getAbsolutePath()); faceDetections = new MatOfRect(); Log.add("Face Detection Module - Load Classifiers \"" + XML_PATH + "\" successfully."); } /**Sử dụng phương thức này để đặt panel nơi sẽ hiển thị ảnh chụp từ camera. * @param pan là JPanel bạn muốn hiển thị ảnh chụp của camera. * @see FaceDetection#setDetectPanel(javax.swing.JPanel, int) */ public static final void setDetectPanel(JPanel pan){ setDetectPanel(pan, 0); } /**Sử dụng phương thức này để đặt bảng điều khiển có góc hiển thị ảnh chụp từ camera. * @param pan là JPanel mà bạn muốn hiển thị ảnh chụp từ camera.
* @param borderRadius là bán kính đường viền góc của JPanel.
* @see FaceDetection#setDetectPanel(javax.swing.JPanel) */ public static final void setDetectPanel(JPanel pan, int borderRadius){ panCam = pan; width = panCam.getWidth(); height = panCam.getHeight(); BorderRadius = borderRadius; } /**Sử dụng phương thức này để bắt đầu nhận diện khuôn mặt bằng ID máy ảnh. * @param index ID của thiết bị quay video cần mở. Để mở máy ảnh mặc định sử dụng giá trị 0. * @see FaceDetection#loadModule() * @see FaceDetection#setDetectPanel(javax.swing.JPanel) * @see FaceDetection#setDetectPanel(javax.swing.JPanel, int) * @see FaceDetection#endDetection() */ public static final void startDetection(int index){ if(!isLoad()){ Log.add("!!! Error try to Face Detection: Module has not been loaded. !!!\n\t\tUse loadModule() and setDetectPanel() method before run this method."); System.exit(0); } webSource = new VideoCapture(index); myThread = new DaemonThread(); Thread t = new Thread(myThread); t.setDaemon(true); myThread.runnable = true; t.start(); } /**Sử dụng phương thức này để kết thúc nhận diện khuôn mặt. * @see FaceDetection#startDetection(int) */ public static final void endDetection(){ myThread.runnable = false; webSource.release(); panCam.getGraphics().clearRect(0, 0, width, height); } /**Sử dụng phương thức này để đặt khung khi phát hiện khuôn mặt. * @param detectFace true nếu bạn muốn nhận diện khuôn mặt, một khung hình chữ nhật sẽ hiển thị khi chúng tôi phát hiện khuôn mặt. false nếu bạn không muốn.
* @param color là màu của khung hình chữ nhật khi nó hiển thị.
* @param thickness là độ dày của khung hình chữ nhật khi nó hiển thị.
* @see FaceDetection#isDetectFace() */ public static final void setDetectFace(boolean detectFace, Color color, int thickness){ DetectFace = detectFace; scalar = new Scalar(color.getBlue(), color.getGreen(), color.getRed()); Thickness = thickness; } /**Sử dụng phương thức này để nhận giá trị liệu khuôn mặt có được phát hiện hay không. * @return true nếu bạn đặt thành phát hiện khuôn mặt, false nếu bạn không đặt giá trị hoặc được đặt thành không phát hiện khuôn mặt. * @see FaceDetection#setDetectFace(boolean, java.awt.Color, int) */ public static final boolean isDetectFace(){ return DetectFace; } /**Sử dụng phương thức này để lấy giá trị nhận diện khuôn mặt có đang chạy hay không. * @return true nếu phương thức startDetection() đang chạy, false nếu không. * @see FaceDetection#startDetection(int) */ public static final boolean isDetection(){ return myThread == null ? false : myThread.runnable; } /**Sử dụng phương thức này để lấy BufferedImage của toàn bộ khung hình đang được hiển thị trên JPanel. * @return một BufferedImage của toàn bộ khung hình trong JPanel. */ public static final BufferedImage getBufferedImage(){ return buff; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy