Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package anlavn.opencv;
// Make By Bình An || AnLaVN || KatoVN
import anlavn.file.Log;
import anlavn.file.Zip;
import anlavn.net.DocNet;
import anlavn.net.License;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import javax.imageio.ImageIO;
/**Lớp FaceRecognition hỗ trợ nhận dạng khuôn mặt trong java, sử dụng chương trình python được biên dịch.
* Lớp này cung cấp các phương thức để tải các thư viện cần thiết, đặt hình ảnh để nhận dạng, định cấu hình cài đặt và thực hiện nhận dạng khuôn mặt.
* @author AnLaVN - https://github.com/AnLaVN
*/
public final class FaceRecognition {
public static String API_KEY = "alk~XXX...XXX";
public static final class Result {
/**Trạng thái kết quả sau khi nhận dạng khuôn mặt:
* [True] nếu Khuôn mặt kiểm thử khớp với Khuôn mặt gốc và percentMatch lớn hơn hoặc bằng RequirementPercent.
* [False] nếu Khuôn mặt kiểm thử không khớp với Khuôn mặt gốc hoặc percentMatch nhỏ hơn RequirementPercent.
* [Empty Error] nếu Khuôn mặt gốc hoặc Khuôn mặt kiểm thử không tồn tại.
* [Invalid Version] nếu phiên bản FaceRecognition hiện tại không khớp với phiên bản yêu cầu. Khi đó chương trình sẽ dừng lại ngay lập tức.
* [Connection Error] nếu một ngoại lệ xảy ra khi kiểm tra phiên bản yêu cầu. Khi đó, chương trình sẽ dừng lại ngay lập tức.
* [Face Recognition Error] nếu một ngoại lệ xảy ra khi nhận dạng khuôn mặt. Như:
* 1. Không có hoặc có quá nhiều khuôn mặt trong khung hình.
* 2. Độ sáng quá thấp.
* 3. Khoảng cách giữa khuôn mặt và máy ảnh quá xa.
* 4. Có khẩu trang, kính, tóc che mặt...
*/
public String state = "[False]";
/**Phần trăm khớp sau khi nhận dạng khuôn mặt. Có giá trị [0,0 -> 100,0]. Càng cao thì càng chính xác.*/
public Double percentMatch = 0.0;
/**Khuôn mặt có khớp với nhau hay không sau khi nhận dạng khuôn mặt:
* true nếu Khuôn mặt kiểm thử khớp với Khuôn mặt gốc và percentMatch lớn hơn hoặc bằng RequirementPercent.
* false nếu Khuôn mặt kiểm thử không khớp với Khuôn mặt gốc hoặc percentMatch nhỏ hơn RequirementPercent.
*/
public boolean isMatch = false;
}
private static final String ZIP_FILE = "FaceRecognition.zip",
EXE_FILE = "FaceRecognition/FaceRecognition.exe",
ORG_PATH = "FaceRecognition/Image/orginal.png",
TES_PATH = "FaceRecognition/Image/testing.png";
private static Double RequiPercent = 65.0;
private static void setImage(String image, String filePath) throws IOException{
if(image == null || image.isBlank()) return;
image = image.replaceAll("\\\\", "/").trim();
boolean isNet = image.startsWith("http");
ImageIO.write(isNet ? ImageIO.read(new URL(image)) : ImageIO.read(new File(image)), "png", new File(filePath));
Log.add("FaceRecognition - Set Image from " + (isNet ? "URL" : "File" ) +" \"" + image + "\" to \"" + filePath +"\" successfully.");
}
private static void setImage(BufferedImage buff, String filePath) throws IOException{
ImageIO.write(buff, "png", new File(filePath));
Log.add("FaceRecognition - Set Image from BufferedImage to \"" + filePath +"\" successfully.");
}
/**Sử dụng phương thức này để kiểm tra Module hỗ trợ nhận dạng khuôn mặt. Chạy phương thức này trước.
* @see FaceRecognition#setImageOrginal(java.lang.String)
* @see FaceRecognition#setImageOrginal(java.awt.image.BufferedImage)
* @see FaceRecognition#setImageTesting(java.lang.String)
* @see FaceRecognition#setImageTesting(java.awt.image.BufferedImage)
* @see FaceRecognition#setRequirementPercent(java.lang.Double)
*/
public static final void loadModule(){
License.check(API_KEY, "AnLaVN03");
if(!new File(EXE_FILE).exists()){
Log.add("!!! Error try to Face Recognition: No module FaceRecognition, trying to download it. !!!");
try {
if(!new File(ZIP_FILE).exists()) new DocNet("https://anlavn-api.vercel.app/api/face_recognition").saveAs(ZIP_FILE);
Zip.extract(ZIP_FILE, "");
} catch (IOException e) {
Log.add("!!! Error try to Face Recognition: Can not download module FaceRecognition. Please check your connecttion. !!!\n\t\tError code: " + e.toString());
throw new RuntimeException(e);
}
}
}
/**Sử dụng phương thức này để đặt ảnh cho khuôn mặt gốc từ Tệp hoặc URL.
* @param image là vị trí cụ thể của ảnh khuôn mặt, nó có thể là đường dẫn cục bộ trong máy tính hoặc địa chỉ liên kết của hình ảnh.
* Ví dụ: "C:/Users/Admin/Pictures/funfact.jpg" hoặc "https://www.onthisday.com/images/people/rowan-atkinson-medium.jpg"
* @throws java.io.IOException ném một ngoại lệ nếu không có kết nối internet hoặc không thể tải xuống hình ảnh từ liên kết.
* @see FaceRecognition#setImageOrginal(java.awt.image.BufferedImage)
* @see FaceRecognition#setImageTesting(java.lang.String)
* @see FaceRecognition#setImageTesting(java.awt.image.BufferedImage)
* @see FaceRecognition#setRequirementPercent(java.lang.Double)
*/
public static final void setImageOrginal(String image) throws IOException{ setImage(image, ORG_PATH); }
/**Sử dụng phương thức này để đặt ảnh cho khuôn mặt kiểm thử từ Tệp hoặc URL.
* @param image là vị trí cụ thể của ảnh khuôn mặt, nó có thể là đường dẫn cục bộ trong máy tính hoặc địa chỉ liên kết của hình ảnh.
* Ví dụ: "C:/Users/Admin/Pictures/funfact.jpg" hoặc "https://www.onthisday.com/images/people/rowan-atkinson-medium.jpg"
* @throws java.io.IOException ném một ngoại lệ nếu không có kết nối internet hoặc không thể tải xuống hình ảnh từ liên kết.
* @see FaceRecognition#setImageOrginal(java.lang.String)
* @see FaceRecognition#setImageOrginal(java.awt.image.BufferedImage)
* @see FaceRecognition#setImageTesting(java.awt.image.BufferedImage)
* @see FaceRecognition#setRequirementPercent(java.lang.Double)
*/
public static final void setImageTesting(String image) throws IOException{ setImage(image, TES_PATH); }
/**Sử dụng phương thức này để đặt hình ảnh cho khuôn mặt gốc từ BufferedImage.
* @param buff là BufferedImage của ảnh khuôn mặt.
* @throws java.io.IOException ném một ngoại lệ nếu không thể ghi BufferedImage vào tệp.
* @see FaceRecognition#setImageOrginal(java.lang.String)
* @see FaceRecognition#setImageTesting(java.lang.String)
* @see FaceRecognition#setImageTesting(java.awt.image.BufferedImage)
* @see FaceRecognition#setRequirementPercent(java.lang.Double)
*/
public static final void setImageOrginal(BufferedImage buff) throws IOException{ setImage(buff, ORG_PATH); }
/**Sử dụng phương thức này để đặt hình ảnh cho khuôn mặt kiểm thử từ BufferedImage.
* @param buff là BufferedImage của ảnh khuôn mặt.
* @throws java.io.IOException ném một ngoại lệ nếu không thể ghi BufferedImage vào tệp.
* @see FaceRecognition#setImageOrginal(java.lang.String)
* @see FaceRecognition#setImageOrginal(java.awt.image.BufferedImage)
* @see FaceRecognition#setImageTesting(java.lang.String)
* @see FaceRecognition#setRequirementPercent(java.lang.Double)
*/
public static final void setImageTesting(BufferedImage buff) throws IOException{ setImage(buff, TES_PATH); }
/**Sử dụng phương thức này để đặt phần trăm yêu cầu cho việc nhận dạng khuôn mặt. Càng cao càng khó. 65 là hiệu suất điển hình tốt nhất và cũng là giá trị mặc định.
* @param per là tỷ lệ phần trăm cần thiết để nhận dạng khuôn mặt trả về true.
* @see FaceRecognition#setImageOrginal(java.lang.String)
* @see FaceRecognition#setImageOrginal(java.awt.image.BufferedImage)
* @see FaceRecognition#setImageTesting(java.lang.String)
* @see FaceRecognition#setImageTesting(java.awt.image.BufferedImage)
*/
public static final void setRequirementPercent(Double per){ RequiPercent = (per >= 0.0 && per <= 100.0) ? per : RequiPercent; }
/**Sử dụng phương thức này để nhận dạng và nhận kết quả sau khi thiết lập thành công tất cả các tham số.
* @return Kết quả sau khi nhận dạng.
*/
public static final Result recognition(){
try {
License.check(API_KEY, "AnLaVN03");
Result result = new Result();
if(!new File(ORG_PATH).exists() || !new File(TES_PATH).exists()) result.state = "[Empty Error]";
else {
Process process = new ProcessBuilder(EXE_FILE).start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
result.state = reader.readLine();
if(!result.state.contains("Invalid") && !result.state.contains("Error")) {
String doub = reader.readLine();
result.percentMatch = 100.0 - Double.parseDouble(doub.substring(1, doub.length() -1 )) * 100;
result.isMatch = result.percentMatch >= RequiPercent;
}
process.destroyForcibly();
}
return result;
} catch (IOException ex) {
Log.add("!!! Error try to Face Recognition: " + ex.toString());
throw new RuntimeException(ex);
}
}
}