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