From 545e80355454ed2991a55e99ed368b7c92b6800c Mon Sep 17 00:00:00 2001 From: Paul-1108 Date: Tue, 17 Dec 2024 19:56:53 +0100 Subject: [PATCH] Luppt Fehlt noch: Transformation und Collision --- .idea/workspace.xml | 87 +++++++++++++++++------------- src/main/java/CamPuffer.java | 2 +- src/main/java/GameLoop.java | 2 +- src/main/java/GraphicsProgram.java | 75 ++++++++++++++++++-------- src/main/java/ImgAnalyzer.java | 59 ++++++++++++++------ 5 files changed, 145 insertions(+), 80 deletions(-) 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 @@ - \ 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; }