Interaktion_GTCaar/src/main/java/CamPuffer.java

137 lines
4.3 KiB
Java
Raw Normal View History

import org.opencv.core.*;
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\\paul3\\OneDrive\\Dokumente\\Studium BME\\Semester 3\\Interaktion\\GTCar V3\\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();
hasStartedCapturing = true;
long lastGcTime = System.currentTimeMillis();
try {
while (running) {
long startTime = System.currentTimeMillis();
capture.read(frame); // Bild einlesen
if (frame.empty()) {
System.out.println("Fehler: Kein Bild von der Kamera erhalten.");
break;
}
// Bildverarbeitung hier
// Debug-Ausgabe
long elapsedTime = System.currentTimeMillis() - startTime;
System.out.println("Verarbeitungszeit für das Bild: " + elapsedTime + " ms");
// 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(); // Falls `frame` in der Schleife freigegeben wurde, hier nochmal
capture.release(); // Kamera-Ressourcen freigeben
}
}
public boolean isHasStartedCapturing() {
return hasStartedCapturing;
}
private void updateCurrentMat(Mat img) {
synchronized (lock) {
// Puffergröße überwachen
if (frameBuffer.size() >= MAX_BUFFER_SIZE) {
Mat oldFrame = frameBuffer.poll(); // Entfernt das älteste Bild im Puffer
if (oldFrame != null) {
oldFrame.release(); // Verhindert das Anhäufen von nicht freigegebenen Mat-Objekten
}
}
// Neues Bild in den Puffer hinzufügen
frameBuffer.add(img.clone());
}
}
public Mat getCurrentMat() {
synchronized (lock) {
return currentMat.clone(); // Rückgabe einer Kopie, um Speicherprobleme zu vermeiden
}
}
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;
}
}