* tambah timestamp

* full resolution ganti ke PNG compression 0
* tambah reduced resolution di 1280x720 JPG quality 100
This commit is contained in:
2025-01-15 10:23:18 +07:00
parent 72e2789d50
commit 30660b9afb
5 changed files with 63 additions and 20 deletions

View File

@@ -1,4 +1,4 @@
#Thu Dec 19 11:49:05 WIB 2024
#Wed Jan 15 10:18:31 WIB 2025
AudioPhase1=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\audio\\phase1.mp3
AudioPhase2=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\audio\\phase2.mp3
AudioPhase3=C\:\\Users\\rdkar\\OneDrive\\Documents\\IntelliJ Project\\ErhaCam\\audio\\phase3.mp3

Binary file not shown.

View File

@@ -5,7 +5,6 @@ import com.google.gson.Gson;
import com.google.zxing.MultiFormatReader;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image;
import lombok.val;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.opencv.global.opencv_imgcodecs;
@@ -37,6 +36,10 @@ public class SomeCodes {
public static final Gson gson = new Gson();
public static final ConfigFile config = new ConfigFile();
public static String GetDateTimeString(){
return LocalDateTime.now().format(dtf);
}
public static Path GetLogsPath(){
return Path.of(currentDirectory, "logs");
}
@@ -288,7 +291,7 @@ public class SomeCodes {
public static String[] MakeArray(String... args){
if (args!=null && args.length>0){
List<String> ll = new ArrayList<String>();
List<String> ll = new ArrayList<>();
for(String x : args){
if (ValidString(x)) ll.add(x);
}

View File

@@ -4,6 +4,7 @@ import Camera.ArducamIMX477Preset;
import Camera.CameraProperty;
import Camera.LiveCamEvent;
import Config.CameraConfigEnum;
import Config.SomeCodes;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
@@ -11,8 +12,6 @@ import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import javafx.application.Platform;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.scene.control.Slider;
@@ -26,6 +25,7 @@ import lombok.Getter;
import lombok.Setter;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.global.opencv_imgproc;
import org.bytedeco.opencv.opencv_core.*;
import org.opencv.videoio.Videoio;
@@ -90,8 +90,10 @@ public class Cameradetail {
private final UMat BestMat = new UMat();
private final UMat LiveMat = new UMat();
private final UMat ReducedMat = new UMat();
private Size LiveSize = new Size(640, 480);
private Size PhotoSize = new Size(1920, 1080);
private Size ReducedSize = new Size(1280, 720);
private Size BestSize = new Size(1920, 1080);
private void setSliderValue(Slider sld, CameraProperty prop, double value){
if (sld!=null){
@@ -310,13 +312,16 @@ public class Cameradetail {
* @param liveheight Height used on live view
* @param photowidth Width used on photo capture
* @param photoheight Height used on photo capture
* @param reducedwidth Width used on reduced resolution
* @param reducedheight Height used on reduced resolution
*/
public void SetGrabber(OpenCVFrameGrabber grabber, int livewidth, int liveheight, int photowidth, int photoheight){
public void SetGrabber(OpenCVFrameGrabber grabber, int livewidth, int liveheight, int photowidth, int photoheight, int reducedwidth, int reducedheight){
if (mGrabber!=null) {
StopLiveView();
}
LiveSize = new Size(livewidth, liveheight);
PhotoSize = new Size(photowidth, photoheight);
BestSize = new Size(photowidth, photoheight);
ReducedSize = new Size(reducedwidth, reducedheight);
mGrabber = grabber;
}
@@ -519,11 +524,36 @@ public class Cameradetail {
if (!BestMat.empty()){
Size sz = BestMat.size();
raise_log("TakePhoto got frame with width: " + sz.width() + " and height: " + sz.height());
String filename = Path.of(directory, makeFileName(prefix)).toString();
if (imwrite(filename, BestMat)){
String timestamp = prefix+" "+SomeCodes.GetDateTimeString();
int fontFace = FONT_HERSHEY_SIMPLEX;
double fontScale = 4.0;
int thickness = 2;
Scalar textColor = new Scalar(255, 255, 255, 0); // white color in BGR format
int[] baseline = {0};
Size textSize = getTextSize(timestamp, fontFace, fontScale, thickness, baseline);
// position of the text in the bottom right corner
int textX = BestMat.cols() - textSize.width() - 10; // 10 pixels from the right
int textY = BestMat.rows() - 10; // 10 pixels from the bottom
opencv_imgproc.putText(BestMat, timestamp, new Point(textX, textY), fontFace, fontScale, textColor, thickness, opencv_imgproc.LINE_AA, false);
int[] paramjpeg = {opencv_imgcodecs.IMWRITE_JPEG_QUALITY, 100};
int[] parampng = {opencv_imgcodecs.IMWRITE_PNG_COMPRESSION, 0};
// save BestMat at quality 9 PNG
String filename = Path.of(directory, makeFileName(prefix,".png")).toString();
if (imwrite(filename, BestMat, parampng)){
raise_log("TakePhoto success, Photo saved to " + filename);
result = filename;
} else raise_log("TakePhoto failed, Unable to Save Photo");
// save ReducedMat at 100% JPEG
String reducedfilename = Path.of(directory, makeReducedFileName(prefix,".jpg")).toString();
opencv_imgproc.resize(BestMat, ReducedMat, ReducedSize);
if (imwrite(reducedfilename, ReducedMat, paramjpeg)){
raise_log("TakePhoto success, Reduced Photo saved to " + reducedfilename);
} else raise_log("TakePhoto failed, Unable to Save Reduced Photo");
} else raise_log("TakePhoto failed, Live View is Empty");
} else raise_log("TakePhoto failed, Grabber is null");
TakingPhoto.set(false);
@@ -531,14 +561,20 @@ public class Cameradetail {
}
//TODO Revisi nama file
private String makeFileName(String prefix){
//make filename with prefix_POSITION_YYYY-MM-DD_HH-MM-SS
@SuppressWarnings("SameParameterValue")
private String makeFileName(String prefix, String extension){
LocalDateTime ldt = LocalDateTime.now();
String timetag = ldt.getYear() + "-" + ldt.getMonthValue() + "-" + ldt.getDayOfMonth() + "_" + ldt.getHour() + "-" + ldt.getMinute() + "-" + ldt.getSecond();
return prefix+" "+timetag+" "+cameratitle.getText() + ".jpg";
return prefix+" "+timetag+" "+cameratitle.getText() + extension;
}
@SuppressWarnings("SameParameterValue")
private String makeReducedFileName(String prefix, String extension){
LocalDateTime ldt = LocalDateTime.now();
String timetag = ldt.getYear() + "-" + ldt.getMonthValue() + "-" + ldt.getDayOfMonth() + "_" + ldt.getHour() + "-" + ldt.getMinute() + "-" + ldt.getSecond();
return prefix+" "+timetag+" "+cameratitle.getText() + "_reduced" + extension;
}
public void StopLiveView(){
@@ -565,15 +601,15 @@ public class Cameradetail {
if (use_qr) raise_log("QR Reader loaded");
if (use_face) raise_log("Face detector loaded");
// capture with best resolution
setFrameHeight(PhotoSize.height());
setFrameWidth(PhotoSize.width());
setFrameHeight(BestSize.height());
setFrameWidth(BestSize.width());
LiveFPS = 0;
mGrabber.start();
Capturing.set(true);
// just information
String ss = String.format("Camera Started with resolution %dx%d@%d", PhotoSize.width(), PhotoSize.height(),LiveFPS);
String ss = String.format("Camera Started with resolution %dx%d@%d", BestSize.width(), BestSize.height(),LiveFPS);
Platform.runLater(()->setCameraStatus(ss));
raise_log(ss);
@@ -628,12 +664,12 @@ public class Cameradetail {
if (use_face){
RectVector face = DetectFace(graymat);
if (face!=null && face.size()>0){
if (event!=null) event.onFaceDetector(true, PhotoSize.width(), PhotoSize.height());
if (event!=null) event.onFaceDetector(true, BestSize.width(), BestSize.height());
for(int i=0; i<face.size(); i++){
Rect rect = face.get(i);
rectangle(LiveMat, rect, Scalar.GREEN);
}
} else if (event!=null) event.onFaceDetector(false, PhotoSize.width(), PhotoSize.height());
} else if (event!=null) event.onFaceDetector(false, BestSize.width(), BestSize.height());
}

View File

@@ -466,6 +466,8 @@ public class CaptureView {
int liveheight = 480;
int photowidth = 640;
int photoheight = 480;
int reducewidth = 640;
int reduceheight = 480;
// mode1 selalu paling tinggi
if (cameraname.contains("ACER QHD")){
@@ -490,8 +492,10 @@ public class CaptureView {
photoheight = ObsbotMeet2.ModeBest.getHeight();
livewidth = ObsbotMeet2.ModeLive.getWidth();
liveheight = ObsbotMeet2.ModeLive.getHeight();
reducewidth = ObsbotMeet2.Mode3.getWidth();
reduceheight = ObsbotMeet2.Mode3.getHeight();
}
image.SetGrabber(grabber, livewidth,liveheight,photowidth,photoheight);
image.SetGrabber(grabber, livewidth,liveheight,photowidth,photoheight,reducewidth,reduceheight);
//TODO reconfirm requirement again
boolean use_face_detector = true;