Interaktion_GTCaar/src/main/java/CamPuffer.java

129 lines
4.1 KiB
Java

import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
import org.opencv.imgproc.Imgproc;
import org.opencv.highgui.HighGui;
import org.opencv.videoio.Videoio;
import java.util.LinkedList;
public class CamPuffer implements Runnable {
static {
try {
System.load("C:\\Users\\david\\Documents\\Uni\\GTCar\\opencv\\build\\java\\x64\\opencv_java4100.dll");
System.out.println("OpenCV manuell geladen!");
} catch (UnsatisfiedLinkError e) {
System.err.println("Fehler beim Laden der OpenCV-Bibliothek: " + e.getMessage());
}
}
private final int CAM; // Kamera-ID (0 für Webcam, 1 für andere Cams)
private final int EXP; // Belichtungszeit
private final int FPS;
private final int THV;
private volatile boolean running = true;
private final Object lock = new Object(); // Lock für Thread-Sicherheit
private Mat currentMat = new Mat();
private final Rect roi = new Rect(200, 150, 240, 180); // Region of Interest
private boolean hasStartedCapturing = false;
private final LinkedList<Mat> frameBuffer = new LinkedList<>();
private final int MAX_BUFFER_SIZE = 10; // Maximale Anzahl an Bildern im Puffer
public CamPuffer(int CAM, int EXP, int FPS, int THV) {
this.CAM = CAM;
this.EXP = EXP;
this.FPS = FPS;
this.THV = THV;
}
@Override
public void run() {
VideoCapture capture = setUp();
if (!capture.isOpened()) {
System.out.println("Fehler: Die Webcam konnte nicht geöffnet werden.");
return;
}
Mat frame = new Mat();
capture.read(frame);
hasStartedCapturing = true;
long lastGcTime = System.currentTimeMillis();
try {
while (running) {
//long startTime = System.currentTimeMillis();
capture.read(frame); // Bild einlesen
currentMat = frame;
if (frame.empty()) {
System.out.println("Fehler: Kein Bild von der Kamera erhalten.");
break;
}
updateCurrentMat(frame);
// Speicherbereinigung alle 1000 ms (1 Sekunde)
if (System.currentTimeMillis() - lastGcTime > 1000) {
System.gc(); // Triggern des Garbage Collectors
lastGcTime = System.currentTimeMillis();
System.out.println("Garbage Collection durchgeführt.");
}
}
} finally {
// Matrizen explizit freigeben
frame.release();
capture.release();
}
}
public void updateCurrentMat(Mat img) {
Mat frameCopy = img.clone();
synchronized (frameBuffer) {
if (frameBuffer.size() >= MAX_BUFFER_SIZE) {
frameBuffer.poll().release(); // Ältesten Frame entfernen
}
frameBuffer.add(frameCopy); // Neuen Frame hinzufügen
currentMat = frameCopy;
}
}
public Mat getCurrentMat() {
synchronized (frameBuffer) {
if (!frameBuffer.isEmpty()) {
Mat resizedFrame = new Mat();
Imgproc.resize(frameBuffer.pollLast().clone(), resizedFrame, new Size(1792, 1024));
return resizedFrame; // Rückgabe des neuesten Frames
}
}
return new Mat(); // Rückgabe eines leeren Frames, falls der Puffer leer ist
}
public void stop() {
running = false;
}
private VideoCapture setUp() {
System.out.println("Laden von OpenCV");
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
VideoCapture capture = new VideoCapture(CAM);
if (!capture.isOpened()) {
System.out.println("Fehler: Die Webcam konnte nicht geöffnet werden.");
}
capture.set(Videoio.CAP_PROP_BUFFERSIZE, 3);
capture.set(Videoio.CAP_PROP_EXPOSURE, EXP);
capture.set(Videoio.CAP_PROP_FPS, FPS);
System.out.println("Kamera geöffnet und eingerichtet");
return capture;
}
}