Trial 05022025
This commit is contained in:
3527
haarcascades/fist.xml
Normal file
3527
haarcascades/fist.xml
Normal file
File diff suppressed because it is too large
Load Diff
12213
haarcascades/haarcascade_eye.xml
Normal file
12213
haarcascades/haarcascade_eye.xml
Normal file
File diff suppressed because it is too large
Load Diff
5211
haarcascades/rpalm.xml
Normal file
5211
haarcascades/rpalm.xml
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -597,8 +597,8 @@ public class ConfigFile {
|
|||||||
cascadeMinSize = toInt(prop.getProperty("cascadeMinSize"));
|
cascadeMinSize = toInt(prop.getProperty("cascadeMinSize"));
|
||||||
cascadeMaxSize = toInt(prop.getProperty("cascadeMaxSize"));
|
cascadeMaxSize = toInt(prop.getProperty("cascadeMaxSize"));
|
||||||
|
|
||||||
Detectors.setMaxSize(cascadeMaxSize);
|
Detectors.setFaceMaxSize(cascadeMaxSize);
|
||||||
Detectors.setMinSize(cascadeMinSize);
|
Detectors.setFaceMinSize(cascadeMinSize);
|
||||||
Detectors.setScaleFactor(cascadeScaleFactor);
|
Detectors.setScaleFactor(cascadeScaleFactor);
|
||||||
|
|
||||||
Logger.info("Config Loaded");
|
Logger.info("Config Loaded");
|
||||||
@@ -649,8 +649,8 @@ public class ConfigFile {
|
|||||||
cascadeMinNeighbors = 3;
|
cascadeMinNeighbors = 3;
|
||||||
cascadeMinSize = 200;
|
cascadeMinSize = 200;
|
||||||
cascadeMaxSize = 400;
|
cascadeMaxSize = 400;
|
||||||
Detectors.setMaxSize(cascadeMaxSize);
|
Detectors.setFaceMaxSize(cascadeMaxSize);
|
||||||
Detectors.setMinSize(cascadeMinSize);
|
Detectors.setFaceMinSize(cascadeMinSize);
|
||||||
Detectors.setScaleFactor(cascadeScaleFactor);
|
Detectors.setScaleFactor(cascadeScaleFactor);
|
||||||
Logger.info("Default Config Created");
|
Logger.info("Default Config Created");
|
||||||
needsave = true;
|
needsave = true;
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import static Config.SomeCodes.*;
|
import static Config.SomeCodes.*;
|
||||||
|
import static id.co.gtc.erhacam.Detectors.*;
|
||||||
import static org.bytedeco.opencv.global.opencv_core.CV_8UC3;
|
import static org.bytedeco.opencv.global.opencv_core.CV_8UC3;
|
||||||
import static org.bytedeco.opencv.global.opencv_core.mean;
|
import static org.bytedeco.opencv.global.opencv_core.mean;
|
||||||
import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;
|
import static org.bytedeco.opencv.global.opencv_imgcodecs.imwrite;
|
||||||
@@ -641,17 +642,32 @@ public class Cameradetail {
|
|||||||
protected Image call() {
|
protected Image call() {
|
||||||
// repeat until capturing is false
|
// repeat until capturing is false
|
||||||
AtomicInteger fps = new AtomicInteger(0);
|
AtomicInteger fps = new AtomicInteger(0);
|
||||||
AtomicBoolean eye_was_closed = new AtomicBoolean(false);
|
boolean eye_was_closed = false;
|
||||||
AtomicInteger blink_counter = new AtomicInteger(0);
|
boolean waiting_for_second_blink = false;
|
||||||
|
long last_blink = 0;
|
||||||
|
|
||||||
TimerTask timerTask = new TimerTask() {
|
TimerTask fpsTask = new TimerTask() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
LiveFPS = fps.getAndSet(0);
|
LiveFPS = fps.getAndSet(0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Timer timer = new java.util.Timer();
|
Timer timer = new java.util.Timer();
|
||||||
timer.scheduleAtFixedRate(timerTask, 1000, 1000);
|
timer.scheduleAtFixedRate(fpsTask, 1000, 1000);
|
||||||
|
|
||||||
|
|
||||||
|
boolean have_frontal_face;
|
||||||
|
boolean have_left_45_face;
|
||||||
|
int _face_width;
|
||||||
|
int _face_height;
|
||||||
|
boolean have_palm = false;
|
||||||
|
boolean have_fist = false;
|
||||||
|
|
||||||
while (Capturing.get()) {
|
while (Capturing.get()) {
|
||||||
try {
|
try {
|
||||||
// selama proses pengambilan foto, jangan ambil frame
|
// selama proses pengambilan foto, jangan ambil frame
|
||||||
@@ -663,9 +679,7 @@ public class Cameradetail {
|
|||||||
IsGrabbingLiveView.set(true);
|
IsGrabbingLiveView.set(true);
|
||||||
Frame frame = mGrabber.grab(); // grab frame
|
Frame frame = mGrabber.grab(); // grab frame
|
||||||
Mat mat = matconverter.convert(frame); // convert to Mat
|
Mat mat = matconverter.convert(frame); // convert to Mat
|
||||||
int counter = fps.incrementAndGet();
|
fps.incrementAndGet();
|
||||||
if (mat.empty()) continue; // kalau gak ada data, continue
|
|
||||||
if (counter % 5 != 0) continue; // frame skip to 6 fps
|
|
||||||
|
|
||||||
mat.copyTo(BestMat); // copy to BestMat for using OpenCL
|
mat.copyTo(BestMat); // copy to BestMat for using OpenCL
|
||||||
IsGrabbingLiveView.set(false);
|
IsGrabbingLiveView.set(false);
|
||||||
@@ -685,119 +699,99 @@ public class Cameradetail {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (use_face){
|
if (use_face){
|
||||||
|
DetectorResult theface = null;
|
||||||
|
have_frontal_face = false;
|
||||||
|
have_left_45_face = false;
|
||||||
|
_face_width = 0;
|
||||||
|
_face_height = 0;
|
||||||
|
|
||||||
List<Rect> frontalfaces = Detectors.HaveFrontalFace(graymat);
|
List<DetectorResult> frontalfaces = HaveFrontalFace(graymat);
|
||||||
if (!frontalfaces.isEmpty()){
|
if (!frontalfaces.isEmpty()){
|
||||||
if (event!=null) event.onFrontalFaceDetector(true, BestSize.width(), BestSize.height());
|
|
||||||
for(Rect rect : frontalfaces){
|
for(DetectorResult rect : frontalfaces){
|
||||||
rectangle(LiveMat, rect, Scalar.GREEN);
|
if (rect.haveFace()){
|
||||||
|
rect.FaceRectangle(LiveMat);
|
||||||
|
rect.EyesRectangle(LiveMat);
|
||||||
|
if (rect.getFaceWidth()>_face_width) _face_width = rect.getFaceWidth();
|
||||||
|
if (rect.getFaceHeight()>_face_height) _face_height = rect.getFaceHeight();
|
||||||
|
theface = rect;
|
||||||
|
have_frontal_face = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (event!=null) event.onFrontalFaceDetector(false, BestSize.width(), BestSize.height());
|
// gak punya frontal face
|
||||||
|
// coba cek punya profile left face 45 gak
|
||||||
|
List<DetectorResult> Left45Faces = HaveLeft45Face(graymat);
|
||||||
|
if (!Left45Faces.isEmpty()){
|
||||||
|
for(DetectorResult rect : Left45Faces){
|
||||||
|
if (rect.haveFace()){
|
||||||
|
rect.FaceRectangle(LiveMat);
|
||||||
|
rect.EyesRectangle(LiveMat);
|
||||||
|
if (rect.getFaceWidth()>_face_width) _face_width = rect.getFaceWidth();
|
||||||
|
if (rect.getFaceHeight()>_face_height) _face_height = rect.getFaceHeight();
|
||||||
|
have_left_45_face = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Rect> Left45Faces = Detectors.HaveLeft45Face(graymat);
|
if (have_frontal_face){
|
||||||
if (!Left45Faces.isEmpty()){
|
if (event!=null) event.onFrontalFaceDetector(true, _face_width, _face_height);
|
||||||
if (event!=null){
|
if (theface.haveEyes()){
|
||||||
event.onLeftEyeDetector(true, BestSize.width(), BestSize.height());
|
// ada mata (buka mata)
|
||||||
event.onProfileFaceDetector(true, BestSize.width(), BestSize.height());
|
if (eye_was_closed){
|
||||||
}
|
eye_was_closed = false;
|
||||||
for(Rect rect : Left45Faces){
|
long now = System.currentTimeMillis();
|
||||||
rectangle(LiveMat, rect, Scalar.BLUE);
|
if (waiting_for_second_blink){
|
||||||
|
long diff = now - last_blink;
|
||||||
|
// kalau beda waktu antara blink 1 dan blink 2 kurang dari 2 detik
|
||||||
|
if (diff<=2000){
|
||||||
|
waiting_for_second_blink = false;
|
||||||
|
System.out.println("Blink Detected from camera "+cameratitle);
|
||||||
|
if (event!=null) event.onBlink(2);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
last_blink = now;
|
||||||
|
waiting_for_second_blink = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// tidak ada mata
|
||||||
|
// transisi dari buka mata ke tutup mata
|
||||||
|
if (!eye_was_closed){
|
||||||
|
eye_was_closed = true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if (have_left_45_face ){
|
||||||
|
if (event!=null) event.onProfileFaceDetector(true, _face_width, _face_height);
|
||||||
} else {
|
} else {
|
||||||
|
// no face at all
|
||||||
|
|
||||||
if (event!=null) {
|
if (event!=null) {
|
||||||
event.onLeftEyeDetector(false, BestSize.width(), BestSize.height());
|
event.onFrontalFaceDetector(false, _face_width, _face_height);
|
||||||
event.onProfileFaceDetector(false, BestSize.width(), BestSize.height());
|
event.onProfileFaceDetector(false, _face_width, _face_height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Rect> Right45Faces = Detectors.HaveRight45Face(graymat);
|
|
||||||
if (!Right45Faces.isEmpty()){
|
|
||||||
if (event!=null){
|
|
||||||
event.onRightEyeDetector(true, BestSize.width(), BestSize.height());
|
|
||||||
event.onProfileFaceDetector(true, BestSize.width(), BestSize.height());
|
|
||||||
}
|
|
||||||
for(Rect rect : Right45Faces){
|
|
||||||
rectangle(LiveMat, rect, Scalar.BLUE);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (event!=null) {
|
|
||||||
event.onRightEyeDetector(false, BestSize.width(), BestSize.height());
|
|
||||||
event.onProfileFaceDetector(false, BestSize.width(), BestSize.height());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// List<Rect> Left90Faces = Detectors.HaveLeft90Face(graymat);
|
|
||||||
// if (!Left90Faces.isEmpty()){
|
|
||||||
// if (event!=null){
|
|
||||||
// event.onLeftEyeDetector(true, BestSize.width(), BestSize.height());
|
|
||||||
// event.onLeftEarDetector(true, BestSize.width(), BestSize.height());
|
|
||||||
// }
|
|
||||||
// for(Rect rect : Left90Faces){
|
|
||||||
// rectangle(LiveMat, rect, Scalar.YELLOW);
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// if (event!=null) {
|
|
||||||
// event.onLeftEyeDetector(false, BestSize.width(), BestSize.height());
|
|
||||||
// event.onLeftEarDetector(false, BestSize.width(), BestSize.height());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// List<Rect> Right90Faces = Detectors.HaveRight90Face(graymat);
|
|
||||||
// if (!Right90Faces.isEmpty()){
|
|
||||||
// if (event!=null){
|
|
||||||
// event.onRightEyeDetector(true, BestSize.width(), BestSize.height());
|
|
||||||
// event.onRightEarDetector(true, BestSize.width(), BestSize.height());
|
|
||||||
// }
|
|
||||||
// for(Rect rect : Right90Faces){
|
|
||||||
// rectangle(LiveMat, rect, Scalar.YELLOW);
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// if (event!=null) {
|
|
||||||
// event.onRightEyeDetector(false, BestSize.width(), BestSize.height());
|
|
||||||
// event.onRightEarDetector(false, BestSize.width(), BestSize.height());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// if (have_face){
|
|
||||||
// // kalau detect muka, baru coba detect mata
|
|
||||||
// RectVector eye = DetectEye(graymat);
|
|
||||||
// if (eye!=null && eye.size()>=2){
|
|
||||||
// // ada mata
|
|
||||||
// if (eye_was_closed.get()){
|
|
||||||
// eye_was_closed.set(false);
|
|
||||||
// if (blink_counter.get()>=2){
|
|
||||||
// blink_counter.set(0);
|
|
||||||
// if (event!=null) event.onBlink(blink_counter.get());
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (event!=null) event.onEyeDetector(true, BestSize.width(), BestSize.height());
|
|
||||||
// for(int i=0; i<eye.size(); i++){
|
|
||||||
// Rect rect = eye.get(i);
|
|
||||||
// rectangle(LiveMat, rect, Scalar.RED);
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// // mata tidak ada
|
|
||||||
// if (!eye_was_closed.get()){
|
|
||||||
// eye_was_closed.set(true);
|
|
||||||
// blink_counter.incrementAndGet();
|
|
||||||
// }
|
|
||||||
// if (event!=null) event.onEyeDetector(false, BestSize.width(), BestSize.height());
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// } else {
|
|
||||||
// eye_was_closed.set(false);
|
|
||||||
// blink_counter.set(0);
|
|
||||||
// // tidak ada muka, tidak ada mata
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (HavePalm(graymat)) {
|
||||||
|
if (!have_palm){
|
||||||
|
have_fist = false;
|
||||||
|
have_palm = true;
|
||||||
|
System.out.println("Palm Detected from camera " + cameratitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (HaveFist(graymat)) {
|
||||||
|
if (!have_fist) {
|
||||||
|
have_palm = false;
|
||||||
|
have_fist = true;
|
||||||
|
System.out.println("Fist Detected from camera "+cameratitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
UMat rgbmat = new UMat(LiveMat.size(), CV_8UC3);
|
UMat rgbmat = new UMat(LiveMat.size(), CV_8UC3);
|
||||||
cvtColor(LiveMat, rgbmat, COLOR_BGR2RGB);
|
cvtColor(LiveMat, rgbmat, COLOR_BGR2RGB);
|
||||||
|
|||||||
@@ -243,11 +243,14 @@ public class CaptureView {
|
|||||||
} else throw new Exception("FTP Host not reachable");
|
} else throw new Exception("FTP Host not reachable");
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
Logger.error("Error UploadToFTP: "+e.getMessage());
|
Logger.error("Error UploadToFTP: "+e.getMessage());
|
||||||
Alert alert = new Alert(AlertType.ERROR);
|
Platform.runLater(()->{
|
||||||
alert.setTitle("Error");
|
Alert alert = new Alert(AlertType.ERROR);
|
||||||
alert.setHeaderText("Upload to FTP Failed");
|
alert.setTitle("Error");
|
||||||
alert.setContentText("Error: "+e.getMessage());
|
alert.setHeaderText("Upload to FTP Failed");
|
||||||
alert.showAndWait();
|
alert.setContentText("Error: "+e.getMessage());
|
||||||
|
alert.showAndWait();
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
} else {
|
} else {
|
||||||
@@ -615,11 +618,24 @@ public class CaptureView {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBlink(int counter) {
|
public void onBlink(int counter) {
|
||||||
String prefix = prefixfile.getText();
|
|
||||||
if (!prefix.isEmpty()){
|
// System.out.println("Blink detected at camera "+title+" counter: "+counter);
|
||||||
if (isTakingPhoto.get()) return; // other camera already detect blinking
|
// Platform.runLater(()->{
|
||||||
btnTakePhoto.fire();
|
// Alert Alert = new Alert(AlertType.INFORMATION);
|
||||||
}
|
// Alert.setTitle("Blink Detected");
|
||||||
|
// Alert.setHeaderText("Blink Detected");
|
||||||
|
// Alert.setContentText("Blink Detected at Camera "+title+" counter: "+counter);
|
||||||
|
// Alert.show();
|
||||||
|
//
|
||||||
|
// String prefix = prefixfile.getText();
|
||||||
|
// //TODO Pastikan Nomor Pelanggan 8 digit
|
||||||
|
// if (prefix.length()>=8){
|
||||||
|
// if (isTakingPhoto.get()) return; // other camera already detect blinking
|
||||||
|
// btnTakePhoto.fire();
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void update_status(Cameradetail image){
|
private void update_status(Cameradetail image){
|
||||||
|
|||||||
54
src/main/java/id/co/gtc/erhacam/DetectorResult.java
Normal file
54
src/main/java/id/co/gtc/erhacam/DetectorResult.java
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package id.co.gtc.erhacam;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.bytedeco.opencv.opencv_core.Rect;
|
||||||
|
import org.bytedeco.opencv.opencv_core.Scalar;
|
||||||
|
import org.bytedeco.opencv.opencv_core.UMat;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.bytedeco.opencv.global.opencv_imgproc.rectangle;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class DetectorResult {
|
||||||
|
private @Setter Rect Face;
|
||||||
|
private List<Rect> Eyes;
|
||||||
|
|
||||||
|
public void AddEye(Rect eye){
|
||||||
|
if (Eyes == null) Eyes = new java.util.ArrayList<>();
|
||||||
|
Eyes.add(eye);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void FaceRectangle(UMat mat){
|
||||||
|
if (haveFace()){
|
||||||
|
rectangle(mat, Face, Scalar.GREEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void EyesRectangle(UMat mat){
|
||||||
|
if (haveEyes()){
|
||||||
|
for(Rect eye : Eyes){
|
||||||
|
rectangle(mat, eye, Scalar.BLUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean haveFace(){
|
||||||
|
return Face != null && Face.width() > 0 && Face.height() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFaceWidth(){
|
||||||
|
if (!haveFace()) return 0;
|
||||||
|
return Face.width();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getFaceHeight(){
|
||||||
|
if (!haveFace()) return 0;
|
||||||
|
return Face.height();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean haveEyes(){
|
||||||
|
return Eyes != null && !Eyes.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,21 +14,55 @@ import java.util.List;
|
|||||||
|
|
||||||
public class Detectors {
|
public class Detectors {
|
||||||
public static CascadeClassifier frontalfaceDetector;
|
public static CascadeClassifier frontalfaceDetector;
|
||||||
public static CascadeClassifier eyeDetector;
|
private static CascadeClassifier eyeDetector;
|
||||||
public static CascadeClassifier leftEyeDetector;
|
|
||||||
public static CascadeClassifier rightEyeDetector;
|
private static CascadeClassifier profilefaceDetector;
|
||||||
public static CascadeClassifier leftEarDetector;
|
private static CascadeClassifier palmDetector;
|
||||||
public static CascadeClassifier rightEarDetector;
|
private static CascadeClassifier fistDetector;
|
||||||
public static CascadeClassifier profilefaceDetector;
|
|
||||||
|
|
||||||
public static void LoadAllDetectors(){
|
public static void LoadAllDetectors(){
|
||||||
LoadFrontalFaceDetector();
|
LoadFrontalFaceDetector();
|
||||||
LoadProfileFaceDetector();
|
|
||||||
LoadEyeDetector();
|
LoadEyeDetector();
|
||||||
LoadLeftEarDetector();
|
|
||||||
LoadRightEarDetector();
|
LoadProfileFaceDetector();
|
||||||
LoadLeftEyeDetector();
|
|
||||||
LoadRightEyeDetector();
|
|
||||||
|
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(){
|
private static void LoadFrontalFaceDetector(){
|
||||||
@@ -64,7 +98,7 @@ public class Detectors {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void LoadEyeDetector(){
|
private static void LoadEyeDetector(){
|
||||||
String filename = SomeCodes.ExtractResource("/haarcascade_eye_tree_eyeglasses.xml");
|
String filename = SomeCodes.ExtractResource("/haarcascade_eye.xml");
|
||||||
if (filename!=null) {
|
if (filename!=null) {
|
||||||
System.out.println("Eye Detector file : " + filename);
|
System.out.println("Eye Detector file : " + filename);
|
||||||
if (eyeDetector==null) {
|
if (eyeDetector==null) {
|
||||||
@@ -80,179 +114,106 @@ public class Detectors {
|
|||||||
} else Logger.error("Unable to extract eye detector file");
|
} 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(){
|
public static boolean HaveFist(UMat graymat){
|
||||||
String filename = SomeCodes.ExtractResource("/haarcascade_righteye_2splits.xml");
|
RectVector fists = Detect(graymat, fistDetector);
|
||||||
if (filename!=null) {
|
return fists!=null && fists.size()>0;
|
||||||
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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
* Detect if there is a frontal face, containing 2 eyes
|
||||||
* @param graymat Mat in Gray Scale
|
* @param graymat Mat in Gray Scale
|
||||||
* @return List of Rect if face detected, otherwise empty list
|
* @return List of Rect if face detected, otherwise empty list
|
||||||
*/
|
*/
|
||||||
public static @NonNull List<Rect> HaveFrontalFace(UMat graymat){
|
public static @NonNull List<DetectorResult> HaveFrontalFace(UMat graymat){
|
||||||
List<Rect> result = new ArrayList<>();
|
List<DetectorResult> result = new ArrayList<>();
|
||||||
RectVector faces = DetectFrontalFace(graymat);
|
RectVector faces = DetectFrontalFace(graymat);
|
||||||
if (faces!=null && faces.size()>0){
|
if (faces!=null && faces.size()>0){
|
||||||
|
|
||||||
for(Rect face : faces.get()){
|
for(Rect face : faces.get()){
|
||||||
UMat faceMat = new UMat(graymat, face);
|
RectVector eyes = DetectEye(graymat);
|
||||||
RectVector eyes = DetectEye(faceMat);
|
DetectorResult dr = new DetectorResult();
|
||||||
|
dr.setFace(face);
|
||||||
if (eyes!=null && eyes.size()>=2){
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NonNull List<Rect> HaveLeft45Face(UMat graymat){
|
public static @NonNull List<DetectorResult> HaveLeft45Face(UMat graymat){
|
||||||
List<Rect> result = new ArrayList<>();
|
List<DetectorResult> result = new ArrayList<>();
|
||||||
RectVector faces = DetectProfileFace(graymat);
|
RectVector faces = DetectProfileFace(graymat);
|
||||||
if (faces!=null && faces.size()>0){
|
if (faces!=null && faces.size()>0){
|
||||||
|
|
||||||
for(Rect face : faces.get()){
|
for(Rect face : faces.get()){
|
||||||
UMat faceMat = new UMat(graymat, face);
|
RectVector eyes = DetectEye(graymat);
|
||||||
RectVector eyes = DetectLeftEye(faceMat);
|
DetectorResult dr = new DetectorResult();
|
||||||
|
dr.setFace(face);
|
||||||
if (eyes!=null && eyes.size()>0){
|
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;
|
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 static double scaleFactor = 1.1;
|
||||||
private final static int minNeighbors = 3;
|
private final static int minNeighbors = 3;
|
||||||
private final static int flags = 0;
|
private final static int flags = 0;
|
||||||
private static Size minSize = new Size(200,200);
|
private static Size FaceminSize = new Size(200,200);
|
||||||
private static Size maxSize = new Size(400,400);
|
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){
|
public static void setScaleFactor(double value){
|
||||||
if (scaleFactor!=value) scaleFactor = value;
|
if (scaleFactor!=value) scaleFactor = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setMinSize(int value){
|
public static void setFaceMinSize(int value){
|
||||||
if (minSize.width()!=value || minSize.height()!=value) minSize = new Size(value, 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){
|
public static void setFaceMaxSize(int value){
|
||||||
if (maxSize.width()!=value || maxSize.height()!=value) maxSize = new Size(value, 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){
|
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
|
* @return RectVector if face detected, otherwise null
|
||||||
*/
|
*/
|
||||||
public static RectVector DetectFrontalFace(UMat graymat){
|
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
|
* Detect Eye from Mat
|
||||||
* If Eye detected, it will return RectVector with size is number of eyes detected
|
* 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
|
* @return RectVector if eye detected, otherwise null
|
||||||
*/
|
*/
|
||||||
public static RectVector DetectEye(UMat graymat){
|
public static RectVector DetectEye(UMat graymat){
|
||||||
|
//return Detect(graymat, eyeDetector, scaleFactor, minNeighbors, flags, EyeminSize, EyemaxSize);
|
||||||
return Detect(graymat, eyeDetector);
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
@SuppressWarnings("unused")
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static RectVector Detect(UMat graymat, CascadeClassifier detector){
|
private static RectVector Detect(UMat graymat, CascadeClassifier detector){
|
||||||
if (detector!=null){
|
if (detector!=null){
|
||||||
if (graymat!=null){
|
if (graymat!=null){
|
||||||
@@ -336,9 +264,14 @@ public class Detectors {
|
|||||||
if (detector!=null){
|
if (detector!=null){
|
||||||
if (graymat!=null){
|
if (graymat!=null){
|
||||||
if (!graymat.empty()){
|
if (!graymat.empty()){
|
||||||
RectVector detected = new RectVector();
|
if (minSize!=null){
|
||||||
detector.detectMultiScale(graymat, detected, scaleFactor, minNeighbors, flags, minSize, maxSize);
|
if (maxSize!=null){
|
||||||
return detected;
|
RectVector detected = new RectVector();
|
||||||
|
detector.detectMultiScale(graymat, detected, scaleFactor, minNeighbors, flags, minSize, maxSize);
|
||||||
|
return detected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public class MainApplication extends Application {
|
|||||||
Screen screen = Screen.getPrimary();
|
Screen screen = Screen.getPrimary();
|
||||||
Rectangle2D screenbound = screen.getVisualBounds();
|
Rectangle2D screenbound = screen.getVisualBounds();
|
||||||
Scene scene = new Scene(fxmlLoader.load(), screenbound.getWidth(), screenbound.getHeight());
|
Scene scene = new Scene(fxmlLoader.load(), screenbound.getWidth(), screenbound.getHeight());
|
||||||
stage.setTitle("MultiCam Capture App for ERHA 03022025-011");
|
stage.setTitle("MultiCam Capture App for ERHA 03022025-033");
|
||||||
stage.setScene(scene);
|
stage.setScene(scene);
|
||||||
stage.setResizable(true);
|
stage.setResizable(true);
|
||||||
stage.setMaximized(true);
|
stage.setMaximized(true);
|
||||||
|
|||||||
@@ -84,8 +84,8 @@ public class SettingView {
|
|||||||
config.setCascadeScaleFactor(scale);
|
config.setCascadeScaleFactor(scale);
|
||||||
config.Save();
|
config.Save();
|
||||||
|
|
||||||
Detectors.setMaxSize(max);
|
Detectors.setFaceMaxSize(max);
|
||||||
Detectors.setMinSize(min);
|
Detectors.setFaceMinSize(min);
|
||||||
Detectors.setScaleFactor(scale);
|
Detectors.setScaleFactor(scale);
|
||||||
val alert = new Alert(Alert.AlertType.INFORMATION);
|
val alert = new Alert(Alert.AlertType.INFORMATION);
|
||||||
alert.setTitle("Cascade Setting");
|
alert.setTitle("Cascade Setting");
|
||||||
|
|||||||
Reference in New Issue
Block a user