diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index ee1f9a5..f81cd63 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -4,15 +4,12 @@
-
-
+
-
-
@@ -33,41 +30,38 @@
"associatedIndex": 8
}
-
-
-
+
- {
+ "keyToString": {
+ "Application.GTCar.executor": "Run",
+ "Application.GraphicsProgram.executor": "Run",
+ "Application.Main.executor": "Run",
+ "Application.Tracker.executor": "Run",
+ "Downloaded.Files.Path.Enabled": "false",
+ "Repository.Attach.Annotations": "false",
+ "Repository.Attach.JavaDocs": "false",
+ "Repository.Attach.Sources": "false",
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "com.codeium.enabled": "true",
+ "git-widget-placeholder": "master",
+ "kotlin-language-version-configured": "true",
+ "last_opened_file_path": "C:/Users/david/Documents/Uni/GTCar/opencv/build/java/opencv-4100.jar",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "project.structure.last.edited": "Libraries",
+ "project.structure.proportion": "0.15",
+ "project.structure.side.proportion": "0.24022989",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
@@ -87,7 +81,7 @@
-
+
@@ -104,6 +98,14 @@
+
+
+
+
+
+
+
+
@@ -116,6 +118,7 @@
+
@@ -165,7 +168,15 @@
1734358037207
-
+
+
+ 1734364131101
+
+
+
+ 1734364131101
+
+
@@ -183,13 +194,13 @@
-
-
+
+
\ No newline at end of file
diff --git a/src/main/java/CamPuffer.java b/src/main/java/CamPuffer.java
index 8f7fc49..5dc8ae7 100644
--- a/src/main/java/CamPuffer.java
+++ b/src/main/java/CamPuffer.java
@@ -11,7 +11,7 @@ public class CamPuffer implements Runnable {
static {
try {
- System.load("C:\\Users\\david\\Documents\\Uni\\GTCar\\opencv\\build\\java\\x64\\opencv_java4100.dll");
+ System.load("C:\\Users\\paul3\\OneDrive\\Dokumente\\Studium BME\\Semester 3\\Interaktion\\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());
diff --git a/src/main/java/GameLoop.java b/src/main/java/GameLoop.java
index a3577f3..19150ad 100644
--- a/src/main/java/GameLoop.java
+++ b/src/main/java/GameLoop.java
@@ -6,7 +6,7 @@ import java.util.List;
public class GameLoop {
int activePlayer = 0;
- private final int CAM = 1; // Kamera-ID (0 für Webcam, 1 für andere Cams)
+ private final int CAM = 0; // Kamera-ID (0 für Webcam, 1 für andere Cams)
private final int EXP = -9; // Belichtungszeit (idealerweise: 0)
private final int FPS = 20; // FPS
private final int THV = 245; // Threshold
diff --git a/src/main/java/GraphicsProgram.java b/src/main/java/GraphicsProgram.java
index 6aca883..b476a3f 100644
--- a/src/main/java/GraphicsProgram.java
+++ b/src/main/java/GraphicsProgram.java
@@ -2,11 +2,17 @@ import processing.core.PApplet;
import processing.core.PImage;
import java.util.LinkedList;
-import java.util.Queue;
public class GraphicsProgram extends PApplet {
- private Queue playerTrails = new LinkedList<>();
+ private LinkedList player1Trail = new LinkedList<>(); // Liste für Spieler 1
+ private LinkedList player2Trail = new LinkedList<>(); // Liste für Spieler 2
+
+ private final int TRAIL_LENGTH = 15;
+ private int trailCounter = 17;
+
+ private int distanceTh = 100;
+
PImage img1;
PImage img2;
@@ -31,33 +37,56 @@ public class GraphicsProgram extends PApplet {
public void draw() {
image(backgroundImage, 0, 0); // Hintergrund zeichnen
+ strokeWeight(20); // Linienstärke festlegen
- int particleSizeP1 = 30;
- int particleSizeP2 = 30;
+ // Linien für Spieler 1 zeichnen
+ stroke(0, 0, 255); // Blau
+ drawTrail(player1Trail);
+ // Linien für Spieler 2 zeichnen
+ stroke(255, 0, 0); // Rot
+ drawTrail(player2Trail);
+ }
+ // Methode, um Linien für eine gegebene Trail-Liste zu zeichnen
+ private void drawTrail(LinkedList trail) {
+ if (trail.size() < 2) return; // Mindestens 2 Punkte nötig, um Linien zu zeichnen
- // Kopie von trailPlayer1 erstellen und durch die Kopie iterieren
- for (int[] koordinates : new LinkedList<>(playerTrails)) {
- int x1 = koordinates[0];
- int y1 = koordinates[1];
- int x2 = koordinates[2];
- int y2 = koordinates[3];
-
- fill(0, 0, 255);
- rect(x1, y1, particleSizeP1, particleSizeP1);
- //image(img1, x1, y1, particleSizeP1, particleSizeP1);
-
- fill(255, 0, 0);
- rect(x2, y2, particleSizeP2, particleSizeP2);
- //image(img2, x2, y2, particleSizeP2, particleSizeP2);
-
+ for (int i = 0; i < trail.size() - 1; i++) {
+ int[] current = trail.get(i);
+ int[] next = trail.get(i + 1);
+ // Null-Check für die Punkte
+ if (current != null && next != null) {
+ if(current[0]-next[0]> -distanceTh && current[0]-next[0]< distanceTh && current[1]-next[1]> -distanceTh && current[1]-next[1]< distanceTh) {
+ line(current[0], current[1], next[0], next[1]);
+ }
+ }
}
-
}
- public void updateTrail(Queue trails){
- this.playerTrails = trails;
+
+ // Methode zum Aktualisieren der Trails für beide Spieler
+ public void updateTrail(int x1, int y1, int x2, int y2) {
+ if (x1 >= 0 && y1 >= 0) {
+ addToTrail(player1Trail, x1, y1);
+ }
+ if (x2 >= 0 && y2 >= 0) {
+ addToTrail(player2Trail, x2, y2);
+ }
}
-}
+
+ // Methode zum Hinzufügen eines Punktes zur Trail-Liste und Begrenzung auf 20 Einträge
+ private void addToTrail(LinkedList trail, int x, int y) {
+ if(trailCounter % 21 == 0) {
+ if (x >= 0 && y >= 0) {
+ trail.add(new int[]{x, y});
+ if (trail.size() > TRAIL_LENGTH) {
+ trail.removeFirst();
+ }
+ }
+ }
+ trailCounter++;
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/ImgAnalyzer.java b/src/main/java/ImgAnalyzer.java
index 7f84393..c0816a0 100644
--- a/src/main/java/ImgAnalyzer.java
+++ b/src/main/java/ImgAnalyzer.java
@@ -6,11 +6,8 @@ import org.opencv.imgproc.Moments;
import org.opencv.videoio.Videoio;
import processing.core.PApplet;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
import java.awt.Point;
-import java.util.Queue;
public class ImgAnalyzer {
@@ -19,7 +16,7 @@ public class ImgAnalyzer {
private Point currentPositionP1 = new Point(0, 0);
private Point currentPositionP2 = new Point(0, 0);
Queue trails = new LinkedList<>();
- private final int TRAIL_LENGTH = 200;
+ private final int TRAIL_LENGTH = 20;
private final CamPuffer camPuffer;
private GraphicsProgram playerGraphics;
@@ -88,11 +85,21 @@ public class ImgAnalyzer {
if(trails.size() > TRAIL_LENGTH){
trails.poll();
}
- System.out.println(trails.size());
- playerGraphics.updateTrail(trails);
- playerGraphics.draw();
-
+ playerGraphics.updateTrail(currentPositionP1.x, currentPositionP1.y, currentPositionP2.x, currentPositionP2.y);
+ //playerGraphics.draw();
}
+
+ /*org.opencv.core.Point pp1 = new org.opencv.core.Point(currentPositionP1.x, currentPositionP1.y);
+ Imgproc.circle(currentImg, pp1, 10, new Scalar(255,0,0), -1);
+
+ org.opencv.core.Point pp2 = new org.opencv.core.Point(currentPositionP2.x, currentPositionP2.y);
+ Imgproc.circle(currentImg, pp2, 10, new Scalar(0,0,255), -1);
+
+ if(currentImg.elemSize() != 0) {
+
+ HighGui.imshow("el thunfisch", currentImg);
+
+ } */
}
}
@@ -103,24 +110,42 @@ public class ImgAnalyzer {
// Finde Konturen
Imgproc.findContours(thresholdFrame, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
- // Sortiere Konturen nach Fläche (absteigend)
- contours.sort((c1, c2) -> Double.compare(Imgproc.contourArea(c2), Imgproc.contourArea(c1)));
-
- // Speichere die Positionen der zwei größten Konturen
+ // Liste für die Positionen und zugehörige Pixelanzahl
List positions = new ArrayList<>();
+ List whitePixelCounts = new ArrayList<>();
- for (int i = 0; i < Math.min(contours.size(), 2); i++) {
- Moments moments = Imgproc.moments(contours.get(i));
+ for (MatOfPoint contour : contours) {
+ Moments moments = Imgproc.moments(contour);
if (moments.get_m00() != 0) {
+ // Berechne den Mittelpunkt der Kontur
int cx = (int) (moments.get_m10() / moments.get_m00());
int cy = (int) (moments.get_m01() / moments.get_m00());
+
+ // Berechne die Anzahl der weißen Pixel in der Kontur
+ Mat mask = Mat.zeros(thresholdFrame.size(), CvType.CV_8UC1);
+ Imgproc.drawContours(mask, List.of(contour), 0, new Scalar(255), -1); // Fülle die Kontur mit Weiß
+ double whitePixels = Core.sumElems(mask).val[0] / 255.0; // Summe der Pixelwerte durch 255 (1 Pixel = 255)
+
+ // Speichere Position und Pixelanzahl
positions.add(new Point(cx, cy));
+ whitePixelCounts.add(whitePixels);
}
}
- //Check
- return positions;
+
+ // Sortiere die Positionen basierend auf der Anzahl weißer Pixel (absteigend)
+ List sortedPositions = new ArrayList<>();
+ while (!whitePixelCounts.isEmpty()) {
+ int maxIndex = whitePixelCounts.indexOf(Collections.max(whitePixelCounts));
+ sortedPositions.add(positions.get(maxIndex));
+ positions.remove(maxIndex);
+ whitePixelCounts.remove(maxIndex);
+ }
+
+ // Gib die Positionen der zwei größten Konturen zurück
+ return sortedPositions.subList(0, Math.min(sortedPositions.size(), 2));
}
+
public synchronized Point getP1() {
return currentPositionP1;
}