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 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_EXPOSURE, EXP); capture.set(Videoio.CAP_PROP_FPS, FPS); System.out.println("Kamera geöffnet und eingerichtet"); return capture; } }