Trial 05022025
This commit is contained in:
@@ -14,21 +14,55 @@ import java.util.List;
|
||||
|
||||
public class Detectors {
|
||||
public static CascadeClassifier frontalfaceDetector;
|
||||
public static CascadeClassifier eyeDetector;
|
||||
public static CascadeClassifier leftEyeDetector;
|
||||
public static CascadeClassifier rightEyeDetector;
|
||||
public static CascadeClassifier leftEarDetector;
|
||||
public static CascadeClassifier rightEarDetector;
|
||||
public static CascadeClassifier profilefaceDetector;
|
||||
private static CascadeClassifier eyeDetector;
|
||||
|
||||
private static CascadeClassifier profilefaceDetector;
|
||||
private static CascadeClassifier palmDetector;
|
||||
private static CascadeClassifier fistDetector;
|
||||
|
||||
public static void LoadAllDetectors(){
|
||||
LoadFrontalFaceDetector();
|
||||
LoadProfileFaceDetector();
|
||||
LoadEyeDetector();
|
||||
LoadLeftEarDetector();
|
||||
LoadRightEarDetector();
|
||||
LoadLeftEyeDetector();
|
||||
LoadRightEyeDetector();
|
||||
|
||||
LoadProfileFaceDetector();
|
||||
|
||||
|
||||
LoadFistDetector();
|
||||
LoadRightPalmDetector();
|
||||
}
|
||||
|
||||
private static void LoadFistDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/fist.xml");
|
||||
if (filename!=null) {
|
||||
System.out.println("Fist Detector file : " + filename);
|
||||
if (fistDetector ==null) {
|
||||
try{
|
||||
|
||||
fistDetector = new CascadeClassifier(filename);
|
||||
Logger.info("FistDetector loaded");
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading FistDetector : " + e.getMessage());
|
||||
}
|
||||
|
||||
} else Logger.info("FistDetector already loaded");
|
||||
} else Logger.error("Unable to extract fist detector file");
|
||||
}
|
||||
|
||||
private static void LoadRightPalmDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/rpalm.xml");
|
||||
if (filename!=null) {
|
||||
System.out.println("Right Palm Detector file : " + filename);
|
||||
if (palmDetector ==null) {
|
||||
try{
|
||||
|
||||
palmDetector = new CascadeClassifier(filename);
|
||||
Logger.info("RightPalmDetector loaded");
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading RightPalmDetector : " + e.getMessage());
|
||||
}
|
||||
|
||||
} else Logger.info("RightPalmDetector already loaded");
|
||||
} else Logger.error("Unable to extract right palm detector file");
|
||||
}
|
||||
|
||||
private static void LoadFrontalFaceDetector(){
|
||||
@@ -64,7 +98,7 @@ public class Detectors {
|
||||
}
|
||||
|
||||
private static void LoadEyeDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_eye_tree_eyeglasses.xml");
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_eye.xml");
|
||||
if (filename!=null) {
|
||||
System.out.println("Eye Detector file : " + filename);
|
||||
if (eyeDetector==null) {
|
||||
@@ -80,179 +114,106 @@ public class Detectors {
|
||||
} else Logger.error("Unable to extract eye detector file");
|
||||
}
|
||||
|
||||
private static void LoadLeftEyeDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_lefteye_2splits.xml");
|
||||
if (filename!=null) {
|
||||
System.out.println("Left Eye Detector file : " + filename);
|
||||
if (leftEyeDetector==null) {
|
||||
try{
|
||||
|
||||
leftEyeDetector = new CascadeClassifier(filename);
|
||||
Logger.info("LeftEyeDetector loaded");
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading LeftEyeDetector : " + e.getMessage());
|
||||
}
|
||||
|
||||
} else Logger.info("LeftEyeDetector already loaded");
|
||||
} else Logger.error("Unable to extract left eye detector file");
|
||||
|
||||
|
||||
|
||||
public static boolean HavePalm(UMat graymat){
|
||||
RectVector palms = Detect(graymat, palmDetector);
|
||||
return palms!=null && palms.size()>0;
|
||||
}
|
||||
|
||||
private static void LoadRightEyeDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_righteye_2splits.xml");
|
||||
if (filename!=null) {
|
||||
System.out.println("Right Eye Detector file : " + filename);
|
||||
if (rightEyeDetector==null) {
|
||||
try{
|
||||
|
||||
rightEyeDetector = new CascadeClassifier(filename);
|
||||
Logger.info("RightEyeDetector loaded");
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading RightEyeDetector : " + e.getMessage());
|
||||
}
|
||||
|
||||
} else Logger.info("RightEyeDetector already loaded");
|
||||
} else Logger.error("Unable to extract right eye detector file");
|
||||
public static boolean HaveFist(UMat graymat){
|
||||
RectVector fists = Detect(graymat, fistDetector);
|
||||
return fists!=null && fists.size()>0;
|
||||
}
|
||||
|
||||
private static void LoadLeftEarDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_mcs_leftear.xml");
|
||||
if (filename!=null) {
|
||||
System.out.println("Left Ear Detector file : " + filename);
|
||||
if (leftEarDetector==null) {
|
||||
try{
|
||||
|
||||
leftEarDetector = new CascadeClassifier(filename);
|
||||
Logger.info("LeftEarDetector loaded");
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading LeftEarDetector : " + e.getMessage());
|
||||
}
|
||||
|
||||
} else Logger.info("LeftEarDetector already loaded");
|
||||
} else Logger.error("Unable to extract left ear detector file");
|
||||
}
|
||||
|
||||
private static void LoadRightEarDetector(){
|
||||
String filename = SomeCodes.ExtractResource("/haarcascade_mcs_rightear.xml");
|
||||
if (filename!=null) {
|
||||
System.out.println("Right Ear Detector file : " + filename);
|
||||
if (rightEarDetector==null) {
|
||||
try{
|
||||
|
||||
rightEarDetector = new CascadeClassifier(filename);
|
||||
Logger.info("RightEarDetector loaded");
|
||||
} catch (Exception e){
|
||||
Logger.error("Exception on loading RightEarDetector : " + e.getMessage());
|
||||
}
|
||||
|
||||
} else Logger.info("RightEarDetector already loaded");
|
||||
} else Logger.error("Unable to extract right ear detector file");
|
||||
}
|
||||
|
||||
|
||||
//TODO buat kalkulasi range minSize dan maxSize kalau pakai BestMat (3840x2160) dan LiveMat (1280x720)
|
||||
|
||||
/**
|
||||
* Detect if there is a frontal face, containing 2 eyes
|
||||
* @param graymat Mat in Gray Scale
|
||||
* @return List of Rect if face detected, otherwise empty list
|
||||
*/
|
||||
public static @NonNull List<Rect> HaveFrontalFace(UMat graymat){
|
||||
List<Rect> result = new ArrayList<>();
|
||||
public static @NonNull List<DetectorResult> HaveFrontalFace(UMat graymat){
|
||||
List<DetectorResult> result = new ArrayList<>();
|
||||
RectVector faces = DetectFrontalFace(graymat);
|
||||
if (faces!=null && faces.size()>0){
|
||||
|
||||
for(Rect face : faces.get()){
|
||||
UMat faceMat = new UMat(graymat, face);
|
||||
RectVector eyes = DetectEye(faceMat);
|
||||
RectVector eyes = DetectEye(graymat);
|
||||
DetectorResult dr = new DetectorResult();
|
||||
dr.setFace(face);
|
||||
if (eyes!=null && eyes.size()>=2){
|
||||
result.add(face);
|
||||
for(Rect eye : eyes.get()){
|
||||
if (eye.x() < face.x() || eye.y() < face.y() || eye.x() + eye.width() > face.x() + face.width() || eye.y() + eye.height() > face.y() + face.height()){
|
||||
continue;
|
||||
}
|
||||
dr.AddEye(eye);
|
||||
}
|
||||
}
|
||||
result.add(dr);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static @NonNull List<Rect> HaveLeft45Face(UMat graymat){
|
||||
List<Rect> result = new ArrayList<>();
|
||||
public static @NonNull List<DetectorResult> HaveLeft45Face(UMat graymat){
|
||||
List<DetectorResult> result = new ArrayList<>();
|
||||
RectVector faces = DetectProfileFace(graymat);
|
||||
if (faces!=null && faces.size()>0){
|
||||
|
||||
for(Rect face : faces.get()){
|
||||
UMat faceMat = new UMat(graymat, face);
|
||||
RectVector eyes = DetectLeftEye(faceMat);
|
||||
RectVector eyes = DetectEye(graymat);
|
||||
DetectorResult dr = new DetectorResult();
|
||||
dr.setFace(face);
|
||||
if (eyes!=null && eyes.size()>0){
|
||||
result.add(face);
|
||||
for(Rect eye : eyes.get()){
|
||||
if (eye.x() < face.x() || eye.y() < face.y() || eye.x() + eye.width() > face.x() + face.width() || eye.y() + eye.height() > face.y() + face.height()){
|
||||
continue;
|
||||
}
|
||||
dr.AddEye(eye);
|
||||
}
|
||||
}
|
||||
result.add(dr);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static @NonNull List<Rect> HaveRight45Face(UMat graymat){
|
||||
List<Rect> result = new ArrayList<>();
|
||||
RectVector faces = DetectProfileFace(graymat);
|
||||
if (faces!=null && faces.size()>0){
|
||||
|
||||
for(Rect face : faces.get()){
|
||||
UMat faceMat = new UMat(graymat, face);
|
||||
RectVector eyes = DetectRightEye(faceMat);
|
||||
if (eyes!=null && eyes.size()>0){
|
||||
result.add(face);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static @NonNull List<Rect> HaveLeft90Face(UMat graymat){
|
||||
List<Rect> result = new ArrayList<>();
|
||||
RectVector leftears = DetectLeftEar(graymat);
|
||||
RectVector lefteyes = DetectLeftEye(graymat);
|
||||
if (leftears!=null && leftears.size()>0 && lefteyes!=null && lefteyes.size()>0){
|
||||
for(Rect ear : leftears.get()){
|
||||
result.add(ear);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static @NonNull List<Rect> HaveRight90Face(UMat graymat){
|
||||
List<Rect> result = new ArrayList<>();
|
||||
RectVector rightears = DetectRightEar(graymat);
|
||||
RectVector righteyes = DetectRightEye(graymat);
|
||||
if (rightears!=null && rightears.size()>0 && righteyes!=null && righteyes.size()>0){
|
||||
for(Rect ear : rightears.get()){
|
||||
result.add(ear);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
private static double scaleFactor = 1.1;
|
||||
private final static int minNeighbors = 3;
|
||||
private final static int flags = 0;
|
||||
private static Size minSize = new Size(200,200);
|
||||
private static Size maxSize = new Size(400,400);
|
||||
private static Size FaceminSize = new Size(200,200);
|
||||
private static Size FacemaxSize = new Size(500,500);
|
||||
|
||||
private static final int EyetoFaceRatio = 6;
|
||||
private static Size EyeminSize = new Size(FaceminSize.width()/EyetoFaceRatio,FaceminSize.height()/EyetoFaceRatio);
|
||||
private static Size EyemaxSize = new Size(FacemaxSize.width()/EyetoFaceRatio,FacemaxSize.height()/EyetoFaceRatio);
|
||||
|
||||
public static void setScaleFactor(double value){
|
||||
if (scaleFactor!=value) scaleFactor = value;
|
||||
}
|
||||
|
||||
public static void setMinSize(int value){
|
||||
if (minSize.width()!=value || minSize.height()!=value) minSize = new Size(value, value);
|
||||
public static void setFaceMinSize(int value){
|
||||
if (FaceminSize.width()!=value || FaceminSize.height()!=value) {
|
||||
FaceminSize = new Size(value, value);
|
||||
EyeminSize = new Size(value/EyetoFaceRatio, value/EyetoFaceRatio);
|
||||
}
|
||||
}
|
||||
|
||||
public static void setMaxSize(int value){
|
||||
if (maxSize.width()!=value || maxSize.height()!=value) maxSize = new Size(value, value);
|
||||
public static void setFaceMaxSize(int value){
|
||||
if (FacemaxSize.width()!=value || FacemaxSize.height()!=value) {
|
||||
FacemaxSize = new Size(value, value);
|
||||
EyemaxSize = new Size(value/EyetoFaceRatio, value/EyetoFaceRatio);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static RectVector DetectProfileFace(UMat graymat){
|
||||
return Detect(graymat, profilefaceDetector, scaleFactor, minNeighbors, flags, minSize, maxSize);
|
||||
return Detect(graymat, profilefaceDetector, scaleFactor, minNeighbors, flags, FaceminSize, FacemaxSize);
|
||||
}
|
||||
|
||||
|
||||
@@ -263,10 +224,12 @@ public class Detectors {
|
||||
* @return RectVector if face detected, otherwise null
|
||||
*/
|
||||
public static RectVector DetectFrontalFace(UMat graymat){
|
||||
return Detect(graymat, frontalfaceDetector, scaleFactor, minNeighbors, flags, minSize, maxSize);
|
||||
return Detect(graymat, frontalfaceDetector, scaleFactor, minNeighbors, flags, FaceminSize, FacemaxSize);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Detect Eye from Mat
|
||||
* If Eye detected, it will return RectVector with size is number of eyes detected
|
||||
@@ -274,49 +237,14 @@ public class Detectors {
|
||||
* @return RectVector if eye detected, otherwise null
|
||||
*/
|
||||
public static RectVector DetectEye(UMat graymat){
|
||||
//return Detect(graymat, eyeDetector, scaleFactor, minNeighbors, flags, EyeminSize, EyemaxSize);
|
||||
return Detect(graymat, eyeDetector);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Detect Left Eye from Mat
|
||||
* @param graymat Mat in Gray Scale
|
||||
* @return RectVector if left eye detected, otherwise null
|
||||
*/
|
||||
public static RectVector DetectLeftEye(UMat graymat){
|
||||
return Detect(graymat, leftEyeDetector);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Detect Right Eye from Mat
|
||||
* @param graymat Mat in Gray Scale
|
||||
* @return RectVector if right eye detected, otherwise null
|
||||
*/
|
||||
public static RectVector DetectRightEye(UMat graymat){
|
||||
return Detect(graymat, rightEyeDetector);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Detect Left Ear from Mat
|
||||
* @param graymat Mat in Gray Scale
|
||||
* @return RectVector if left ear detected, otherwise null
|
||||
*/
|
||||
public static RectVector DetectLeftEar(UMat graymat){
|
||||
return Detect(graymat, leftEarDetector);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Detect Right Ear from Mat
|
||||
* @param graymat Mat in Gray Scale
|
||||
* @return RectVector if right ear detected, otherwise null
|
||||
*/
|
||||
public static RectVector DetectRightEar(UMat graymat){
|
||||
return Detect(graymat, rightEarDetector);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private static RectVector Detect(UMat graymat, CascadeClassifier detector){
|
||||
if (detector!=null){
|
||||
if (graymat!=null){
|
||||
@@ -336,9 +264,14 @@ public class Detectors {
|
||||
if (detector!=null){
|
||||
if (graymat!=null){
|
||||
if (!graymat.empty()){
|
||||
RectVector detected = new RectVector();
|
||||
detector.detectMultiScale(graymat, detected, scaleFactor, minNeighbors, flags, minSize, maxSize);
|
||||
return detected;
|
||||
if (minSize!=null){
|
||||
if (maxSize!=null){
|
||||
RectVector detected = new RectVector();
|
||||
detector.detectMultiScale(graymat, detected, scaleFactor, minNeighbors, flags, minSize, maxSize);
|
||||
return detected;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user