</list> | </list> | ||||
</option> | </option> | ||||
</component> | </component> | ||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_23" default="true" project-jdk-name="openjdk-23" project-jdk-type="JavaSDK"> | |||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_X" default="true" project-jdk-name="openjdk-23" project-jdk-type="JavaSDK"> | |||||
<output url="file://$PROJECT_DIR$/out" /> | <output url="file://$PROJECT_DIR$/out" /> | ||||
</component> | </component> | ||||
</project> | </project> |
<option name="autoReloadType" value="SELECTIVE" /> | <option name="autoReloadType" value="SELECTIVE" /> | ||||
</component> | </component> | ||||
<component name="ChangeListManager"> | <component name="ChangeListManager"> | ||||
<list default="true" id="4d75e996-cee4-4ec6-b802-5b56d0c0eac4" name="Changes" comment="Funktionierender Puffer 16.12.2024 15.06 Siuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu"> | |||||
<change afterPath="$PROJECT_DIR$/Background.png" afterDir="false" /> | |||||
<list default="true" id="4d75e996-cee4-4ec6-b802-5b56d0c0eac4" name="Changes" comment="Puffer Versuch Speicher läuft voll 16.12.2024 03:30"> | |||||
<change afterPath="$PROJECT_DIR$/Welcome0.png" afterDir="false" /> | |||||
<change afterPath="$PROJECT_DIR$/Welcome1.png" afterDir="false" /> | |||||
<change afterPath="$PROJECT_DIR$/Welcome2.png" afterDir="false" /> | |||||
<change afterPath="$PROJECT_DIR$/Welcome3.png" afterDir="false" /> | |||||
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" /> | |||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> | <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> | ||||
<change beforePath="$PROJECT_DIR$/src/main/java/CamPuffer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/CamPuffer.java" afterDir="false" /> | <change beforePath="$PROJECT_DIR$/src/main/java/CamPuffer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/CamPuffer.java" afterDir="false" /> | ||||
<change beforePath="$PROJECT_DIR$/src/main/java/GameLogic.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/GameLogic.java" afterDir="false" /> | |||||
<change beforePath="$PROJECT_DIR$/src/main/java/GameLoop.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/GameLoop.java" afterDir="false" /> | <change beforePath="$PROJECT_DIR$/src/main/java/GameLoop.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/GameLoop.java" afterDir="false" /> | ||||
<change beforePath="$PROJECT_DIR$/src/main/java/GraphicsProgram.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/GraphicsProgram.java" afterDir="false" /> | <change beforePath="$PROJECT_DIR$/src/main/java/GraphicsProgram.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/GraphicsProgram.java" afterDir="false" /> | ||||
<change beforePath="$PROJECT_DIR$/src/main/java/ImgAnalyzer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/ImgAnalyzer.java" afterDir="false" /> | <change beforePath="$PROJECT_DIR$/src/main/java/ImgAnalyzer.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/ImgAnalyzer.java" afterDir="false" /> | ||||
"associatedIndex": 8 | "associatedIndex": 8 | ||||
}</component> | }</component> | ||||
<component name="ProjectId" id="2p7Eq8ZJM8BEjLybOnAdhzZ82uv" /> | <component name="ProjectId" id="2p7Eq8ZJM8BEjLybOnAdhzZ82uv" /> | ||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true"> | |||||
<ConfirmationsSetting value="2" id="Add" /> | |||||
</component> | |||||
<component name="ProjectLevelVcsManager" settingsEditedManually="true" /> | |||||
<component name="ProjectViewState"> | <component name="ProjectViewState"> | ||||
<option name="hideEmptyMiddlePackages" value="true" /> | <option name="hideEmptyMiddlePackages" value="true" /> | ||||
<option name="showLibraryContents" value="true" /> | <option name="showLibraryContents" value="true" /> | ||||
</component> | </component> | ||||
<component name="PropertiesComponent"><![CDATA[{ | |||||
"keyToString": { | |||||
"ASKED_ADD_EXTERNAL_FILES": "true", | |||||
"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" | |||||
<component name="PropertiesComponent">{ | |||||
"keyToString": { | |||||
"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/paul3/OneDrive/Dokumente/Studium BME/Semester 3/Interaktion/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" | |||||
} | } | ||||
}]]></component> | |||||
}</component> | |||||
<component name="RecentsManager"> | |||||
<key name="MoveFile.RECENT_KEYS"> | |||||
<recent name="C:\Users\paul3\OneDrive\Dokumente\Studium BME\Semester 2\Praktikum Programmieren 2 A\Interaktion_GTCaar" /> | |||||
</key> | |||||
</component> | |||||
<component name="RunManager" selected="Application.Main"> | <component name="RunManager" selected="Application.Main"> | ||||
<configuration name="GTCar" type="Application" factoryName="Application"> | |||||
<option name="MAIN_CLASS_NAME" value="Tracker" /> | |||||
<module name="GTCar_V2_maven" /> | |||||
<option name="VM_PARAMETERS" value="-Djava.library.path=C:\Users\david\Documents\Uni\GTCar\opencv\build\java\x64" /> | |||||
<method v="2"> | |||||
<option name="Make" enabled="true" /> | |||||
</method> | |||||
</configuration> | |||||
<configuration name="GraphicsProgram" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true"> | |||||
<option name="MAIN_CLASS_NAME" value="GraphicsProgram" /> | |||||
<configuration name="ImgAnalyzer" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true"> | |||||
<option name="MAIN_CLASS_NAME" value="ImgAnalyzer" /> | |||||
<module name="GTCar_V2_maven" /> | <module name="GTCar_V2_maven" /> | ||||
<option name="PROGRAM_PARAMETERS" value="-Djava.library.path="C:\Users\paul3\OneDrive\Dokumente\Studium BME\Semester 3\Interaktion\opencv\build\java\x64"" /> | |||||
<method v="2"> | <method v="2"> | ||||
<option name="Make" enabled="true" /> | <option name="Make" enabled="true" /> | ||||
</method> | </method> | ||||
<configuration name="Main" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true"> | <configuration name="Main" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true"> | ||||
<option name="MAIN_CLASS_NAME" value="Main" /> | <option name="MAIN_CLASS_NAME" value="Main" /> | ||||
<module name="GTCar_V2_maven" /> | <module name="GTCar_V2_maven" /> | ||||
<option name="VM_PARAMETERS" value="-Djava.library.path=C:\Users\david\Documents\Uni\GTCar\opencv\build\java\x64" /> | |||||
<option name="PROGRAM_PARAMETERS" value="-Djava.library.path="C:\Users\paul3\OneDrive\Dokumente\Studium BME\Semester 3\Interaktion\opencv\build\java\x64"" /> | |||||
<method v="2"> | <method v="2"> | ||||
<option name="Make" enabled="true" /> | <option name="Make" enabled="true" /> | ||||
</method> | </method> | ||||
</configuration> | </configuration> | ||||
<list> | <list> | ||||
<item itemvalue="Application.GTCar" /> | |||||
<item itemvalue="Application.GraphicsProgram" /> | |||||
<item itemvalue="Application.Main" /> | <item itemvalue="Application.Main" /> | ||||
<item itemvalue="Application.ImgAnalyzer" /> | |||||
</list> | </list> | ||||
<recent_temporary> | <recent_temporary> | ||||
<list> | <list> | ||||
<item itemvalue="Application.Main" /> | <item itemvalue="Application.Main" /> | ||||
<item itemvalue="Application.GraphicsProgram" /> | |||||
<item itemvalue="Application.ImgAnalyzer" /> | |||||
</list> | </list> | ||||
</recent_temporary> | </recent_temporary> | ||||
</component> | </component> | ||||
<component name="SharedIndexes"> | |||||
<attachedChunks> | |||||
<set> | |||||
<option value="bundled-jdk-9f38398b9061-39b83d9b5494-intellij.indexing.shared.core-IU-241.15989.150" /> | |||||
<option value="bundled-js-predefined-1d06a55b98c1-91d5c284f522-JavaScript-IU-241.15989.150" /> | |||||
</set> | |||||
</attachedChunks> | |||||
</component> | |||||
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> | <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" /> | ||||
<component name="TaskManager"> | <component name="TaskManager"> | ||||
<task active="true" id="Default" summary="Default task"> | <task active="true" id="Default" summary="Default task"> | ||||
<option name="presentableId" value="Default" /> | <option name="presentableId" value="Default" /> | ||||
<updated>1732108904989</updated> | <updated>1732108904989</updated> | ||||
<workItem from="1732108906083" duration="758000" /> | <workItem from="1732108906083" duration="758000" /> | ||||
<workItem from="1732113837570" duration="20534000" /> | |||||
<workItem from="1733327375447" duration="951000" /> | |||||
<workItem from="1734091457440" duration="10746000" /> | |||||
<workItem from="1732113837570" duration="5187000" /> | |||||
<workItem from="1734302243298" duration="10745000" /> | |||||
<workItem from="1734469984979" duration="8232000" /> | |||||
</task> | </task> | ||||
<task id="LOCAL-00001" summary="First Commit Test"> | <task id="LOCAL-00001" summary="First Commit Test"> | ||||
<option name="closed" value="true" /> | <option name="closed" value="true" /> | ||||
<option name="project" value="LOCAL" /> | <option name="project" value="LOCAL" /> | ||||
<updated>1732118799936</updated> | <updated>1732118799936</updated> | ||||
</task> | </task> | ||||
<task id="LOCAL-00003" summary="Version 23.11 (Grafics update)"> | |||||
<option name="closed" value="true" /> | |||||
<created>1732368525825</created> | |||||
<option name="number" value="00003" /> | |||||
<option name="presentableId" value="LOCAL-00003" /> | |||||
<option name="project" value="LOCAL" /> | |||||
<updated>1732368525826</updated> | |||||
</task> | |||||
<task id="LOCAL-00004" summary="Version 27.11"> | |||||
<option name="closed" value="true" /> | |||||
<created>1732703104268</created> | |||||
<option name="number" value="00004" /> | |||||
<option name="presentableId" value="LOCAL-00004" /> | |||||
<option name="project" value="LOCAL" /> | |||||
<updated>1732703104268</updated> | |||||
</task> | |||||
<task id="LOCAL-00005" summary="Version 27.11 ("fertiger" Tracker)"> | |||||
<option name="closed" value="true" /> | |||||
<created>1732706211714</created> | |||||
<option name="number" value="00005" /> | |||||
<option name="presentableId" value="LOCAL-00005" /> | |||||
<option name="project" value="LOCAL" /> | |||||
<updated>1732706211714</updated> | |||||
</task> | |||||
<task id="LOCAL-00006" summary="Funktionierender Puffer 16.12.2024 15.06 Siuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu"> | |||||
<option name="closed" value="true" /> | |||||
<created>1734358037207</created> | |||||
<option name="number" value="00006" /> | |||||
<option name="presentableId" value="LOCAL-00006" /> | |||||
<option name="project" value="LOCAL" /> | |||||
<updated>1734358037207</updated> | |||||
</task> | |||||
<option name="localTasksCounter" value="7" /> | |||||
<option name="localTasksCounter" value="3" /> | |||||
<servers /> | <servers /> | ||||
</component> | </component> | ||||
<component name="TypeScriptGeneratedFilesManager"> | <component name="TypeScriptGeneratedFilesManager"> | ||||
</option> | </option> | ||||
</component> | </component> | ||||
<component name="VcsManagerConfiguration"> | <component name="VcsManagerConfiguration"> | ||||
<option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" /> | |||||
<MESSAGE value="First Commit Test" /> | <MESSAGE value="First Commit Test" /> | ||||
<MESSAGE value="Version 20.11" /> | <MESSAGE value="Version 20.11" /> | ||||
<MESSAGE value="Version 23.11 (Grafics update)" /> | |||||
<MESSAGE value="Version 27.11" /> | |||||
<MESSAGE value="Version 27.11 ("fertiger" Tracker)" /> | |||||
<MESSAGE value="Funktionierender Puffer 16.12.2024 15.06 Siuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu" /> | |||||
<option name="LAST_COMMIT_MESSAGE" value="Funktionierender Puffer 16.12.2024 15.06 Siuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu" /> | |||||
<option name="LAST_COMMIT_MESSAGE" value="Version 20.11" /> | |||||
</component> | </component> | ||||
</project> | </project> |
static { | static { | ||||
try { | 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\\GTCar V3\\opencv\\build\\java\\x64\\opencv_java4100.dll"); | |||||
System.out.println("OpenCV manuell geladen!"); | System.out.println("OpenCV manuell geladen!"); | ||||
} catch (UnsatisfiedLinkError e) { | } catch (UnsatisfiedLinkError e) { | ||||
System.err.println("Fehler beim Laden der OpenCV-Bibliothek: " + e.getMessage()); | System.err.println("Fehler beim Laden der OpenCV-Bibliothek: " + e.getMessage()); | ||||
if (System.currentTimeMillis() - lastGcTime > 1000) { | if (System.currentTimeMillis() - lastGcTime > 1000) { | ||||
System.gc(); // Triggern des Garbage Collectors | System.gc(); // Triggern des Garbage Collectors | ||||
lastGcTime = System.currentTimeMillis(); | lastGcTime = System.currentTimeMillis(); | ||||
System.out.println("Garbage Collection durchgeführt."); | |||||
//System.out.println("Garbage Collection durchgeführt."); | |||||
} | } | ||||
} | } | ||||
} finally { | } finally { | ||||
public Mat getCurrentMat() { | public Mat getCurrentMat() { | ||||
synchronized (frameBuffer) { | synchronized (frameBuffer) { | ||||
if (!frameBuffer.isEmpty()) { | if (!frameBuffer.isEmpty()) { | ||||
Mat resizedFrame = new Mat(); | |||||
Imgproc.resize(frameBuffer.pollLast().clone(), resizedFrame, new Size(1792, 1024)); | |||||
return resizedFrame; // Rückgabe des neuesten Frames | |||||
return frameBuffer.pollLast().clone(); // Rückgabe des neuesten Frames | |||||
} | } | ||||
} | } | ||||
return new Mat(); // Rückgabe eines leeren Frames, falls der Puffer leer ist | return new Mat(); // Rückgabe eines leeren Frames, falls der Puffer leer ist |
import org.opencv.highgui.HighGui; | |||||
import processing.core.PApplet; | import processing.core.PApplet; | ||||
import java.awt.Point; | |||||
import java.awt.*; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import static java.lang.Thread.sleep; | |||||
public class GameLoop { | public class GameLoop { | ||||
int activePlayer = 0; | int activePlayer = 0; | ||||
private final int CAM = 1; // Kamera-ID (0 für Webcam, 1 für andere Cams) | |||||
private final int EXP = -9; // Belichtungszeit (idealerweise: 0) | |||||
private final int CAM = 0; // Kamera-ID (0 für Webcam, 1 für andere Cams) | |||||
private final int EXP = -8; // Belichtungszeit (idealerweise: 0) | |||||
private final int FPS = 20; // FPS | private final int FPS = 20; // FPS | ||||
private final int THV = 245; // Threshold | |||||
private final int THV = 240; | |||||
private final int TRAIL_LENGTH = 50; | |||||
ImgAnalyzer tracker; | ImgAnalyzer tracker; | ||||
CamPuffer camPuffer; | CamPuffer camPuffer; | ||||
Player player2; | Player player2; | ||||
public GameLoop(){ | public GameLoop(){ | ||||
player1 = new Player(0, "192.168.1.1", 9000); | |||||
player2 = new Player(1, "192.168.1.2", 9000); | |||||
player1 = new Player(0, TRAIL_LENGTH); | |||||
player2 = new Player(1, TRAIL_LENGTH); | |||||
camPuffer = new CamPuffer(CAM, EXP, FPS, THV); | camPuffer = new CamPuffer(CAM, EXP, FPS, THV); | ||||
Thread pufferThread = new Thread(camPuffer); | Thread pufferThread = new Thread(camPuffer); | ||||
pufferThread.start(); | pufferThread.start(); | ||||
tracker = new ImgAnalyzer(camPuffer, THV); | |||||
Thread trackerThread = new Thread(tracker::run); | |||||
trackerThread.start(); | |||||
/*graphics = new GraphicsProgram(player1, player2); | |||||
graphics = new GraphicsProgram(); | |||||
String[] args = {"GraphicsProgram"}; | String[] args = {"GraphicsProgram"}; | ||||
PApplet.runSketch(args, graphics); | PApplet.runSketch(args, graphics); | ||||
tracker = new ImgAnalyzer(camPuffer, THV, graphics); | |||||
Thread trackerThread = new Thread(tracker::run); | |||||
trackerThread.start(); | |||||
/* | |||||
gl = new GameLogic(); | gl = new GameLogic(); | ||||
String[] args_ = {"GameLogic"}; | String[] args_ = {"GameLogic"}; | ||||
PApplet.runSketch(args_, gl); */ | PApplet.runSketch(args_, gl); */ | ||||
} | } | ||||
private void run(){ | private void run(){ | ||||
while(true){ | |||||
//communicate(); | |||||
Point p1 = tracker.getP1(); | |||||
//System.out.println("Player 1 is at " + p1.x + " and " + p1.y); | |||||
Point p2 = tracker.getP2(); | |||||
//System.out.println("Player 2 is at " + p2.x + " and " + p2.y); | |||||
/*player1.setKoords(p1.x, p1.y); | |||||
player2.setKoords(p2.x, p2.y); | |||||
if(gl.doCheckExtern(player2.getTrail(), p1)){ //Check Position von P1 mit Spur von P2 | |||||
System.out.println("Spieler 1 hat verloren"); | |||||
break; | |||||
while(camPuffer.getCurrentMat().elemSize() == 0){ | |||||
System.out.println("Camera booting up"); | |||||
try { | |||||
sleep(1000); | |||||
} catch (InterruptedException e) { | |||||
e.printStackTrace(); | |||||
} | } | ||||
} | |||||
graphics.nextGameState(); | |||||
//Hier kommt Morphing rein | |||||
graphics.nextGameState(); | |||||
while(true){ | |||||
if(gl.doCheckExtern(player1.getTrail(), p2)){ //Check Position von P2 mit Spur von P1 | |||||
System.out.println("Spieler 2 hat verloren"); | |||||
break; | |||||
} */ | |||||
//draw(); | |||||
try{ | |||||
wait(50); | |||||
} | |||||
catch (Exception e){ | |||||
} | |||||
} | } | ||||
} | } | ||||
private void communicate() { | private void communicate() { | ||||
//offen für Auto Kommunikation | //offen für Auto Kommunikation | ||||
} | } | ||||
/*private List<Point> track(){ | |||||
Point p1 = tracker.getP1(); | |||||
Point p2 = tracker.getP2(); | |||||
System.out.println(p1.x); | |||||
player1.setKoords(p1.x, p1.y); | |||||
player2.setKoords(p2.x, p2.y); | |||||
List<Point> output = new ArrayList<>(); | |||||
output.add(0, p1); | |||||
output.add(1, p2); | |||||
return output; | |||||
}*/ | |||||
private void draw(){ | |||||
} | |||||
} | } |
import processing.core.PImage; | import processing.core.PImage; | ||||
import java.util.LinkedList; | import java.util.LinkedList; | ||||
import java.util.Queue; | |||||
import java.util.List; | |||||
public class GraphicsProgram extends PApplet { | public class GraphicsProgram extends PApplet { | ||||
private Queue<int[]> playerTrails = new LinkedList<>(); | |||||
private LinkedList<int[]> player1Trail = new LinkedList<>(); // Liste für Spieler 1 | |||||
private LinkedList<int[]> player2Trail = new LinkedList<>(); // Liste für Spieler 2 | |||||
private final int TRAIL_LENGTH = 150; | |||||
private int trailCounter = 17; | |||||
private int distanceTh = 100; | |||||
private int gameState = 0; //0 für Welcome, 1 für Morphing, 2 für Game, 3 für Gameover | |||||
private float startingTime = System.currentTimeMillis(); | |||||
PImage img1; | PImage img1; | ||||
PImage img2; | PImage img2; | ||||
PImage backgroundImage; | PImage backgroundImage; | ||||
LinkedList<PImage> cameraLoadingImages = new LinkedList<>(); | |||||
public static void main(String[] args) { | public static void main(String[] args) { | ||||
PApplet.main("GraphicsProgram"); | PApplet.main("GraphicsProgram"); | ||||
} | } | ||||
img1 = loadImage("TrailBlue.png"); | img1 = loadImage("TrailBlue.png"); | ||||
img2 = loadImage("TrailRed.png"); | img2 = loadImage("TrailRed.png"); | ||||
cameraLoadingImages.add(loadImage("Welcome0.png")); | |||||
cameraLoadingImages.add(loadImage("Welcome1.png")); | |||||
cameraLoadingImages.add(loadImage("Welcome2.png")); | |||||
cameraLoadingImages.add(loadImage("Welcome3.png")); | |||||
} | } | ||||
public void draw() { | public void draw() { | ||||
image(backgroundImage, 0, 0); // Hintergrund zeichnen | |||||
if (gameState == 0) { | |||||
drawWelcome(); | |||||
} | |||||
if (gameState == 1) { | |||||
setUpMorphing(); | |||||
} | |||||
if (gameState == 2) { | |||||
gameScreen(); | |||||
} | |||||
if (gameState == 3) { | |||||
gameOverScreen(); | |||||
} | |||||
} | |||||
int particleSizeP1 = 30; | |||||
int particleSizeP2 = 30; | |||||
public void drawWelcome() { | |||||
int waitingTime = (int) (System.currentTimeMillis() / 1000); | |||||
switch (waitingTime % 4) { | |||||
case 0: | |||||
image(cameraLoadingImages.get(0), 0, 0); | |||||
break; | |||||
case 1: | |||||
image(cameraLoadingImages.get(1), 0, 0); | |||||
break; | |||||
case 2: | |||||
image(cameraLoadingImages.get(2), 0, 0); | |||||
break; | |||||
case 3: | |||||
image(cameraLoadingImages.get(3), 0, 0); | |||||
} | |||||
} | |||||
private void setUpMorphing() { | |||||
} | |||||
private void gameScreen() { | |||||
image(backgroundImage, 0, 0); // Hintergrund zeichnen | |||||
strokeWeight(20); // Linienstärke festlegen | |||||
// Linien für Spieler 1 zeichnen | |||||
stroke(0, 0, 255); // Blau | |||||
drawTrail(player1Trail, 1); | |||||
// Linien für Spieler 2 zeichnen | |||||
stroke(255, 0, 0); // Rot | |||||
drawTrail(player2Trail, 2); | |||||
} | |||||
// 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]; | |||||
private void gameOverScreen() { | |||||
} | |||||
fill(0, 0, 255); | |||||
rect(x1, y1, particleSizeP1, particleSizeP1); | |||||
//image(img1, x1, y1, particleSizeP1, particleSizeP1); | |||||
public void nextGameState() { | |||||
gameState++; | |||||
} | |||||
fill(255, 0, 0); | |||||
rect(x2, y2, particleSizeP2, particleSizeP2); | |||||
//image(img2, x2, y2, particleSizeP2, particleSizeP2); | |||||
// Methode, um Linien für eine gegebene Trail-Liste zu zeichnen | |||||
private void drawTrail(LinkedList<int[]> trail, int player) { | |||||
if (trail.size() < 4) return; // Mindestens 2 Punkte nötig, um Linien zu zeichnen | |||||
for (int i = 0; i < trail.size() - 1; i++) { | |||||
if (player == 1){ | |||||
stroke(170-(255/trail.size() * i),0,255/2 + (255/trail.size() * i)/2); | |||||
} else if (player == 2){ | |||||
stroke(255, 170-(255/trail.size() * i), 0); | |||||
} | |||||
int[] current = new int[2]; | |||||
try { | |||||
current = trail.get(i); | |||||
} catch (NullPointerException e) { | |||||
System.out.println("Index 1 out of bounds"); | |||||
continue; | |||||
} | |||||
int[] next = new int[2]; | |||||
try { | |||||
next = trail.get(i + 1); | |||||
} catch (NullPointerException e) { | |||||
System.out.println("Index 2 out of bounds"); | |||||
continue; | |||||
} | |||||
// 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]); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
// 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); | |||||
} | } | ||||
} | } | ||||
public void updateTrail(Queue<int[]> trails){ | |||||
this.playerTrails = trails; | |||||
// Methode zum Hinzufügen eines Punktes zur Trail-Liste und Begrenzung auf 20 Einträge | |||||
private void addToTrail(LinkedList<int[]> trail, int x, int y) { | |||||
if (trailCounter % 7 == 0) { | |||||
if (x >= 0 && y >= 0) { | |||||
trail.add(new int[]{x, y}); | |||||
if (trail.size() > TRAIL_LENGTH) { | |||||
trail.removeFirst(); | |||||
} | |||||
} | |||||
} | |||||
trailCounter++; | |||||
} | } | ||||
} | |||||
} |
import org.opencv.videoio.Videoio; | import org.opencv.videoio.Videoio; | ||||
import processing.core.PApplet; | 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.awt.Point; | ||||
import java.util.Queue; | |||||
public class ImgAnalyzer { | public class ImgAnalyzer { | ||||
private Point currentPositionP1 = new Point(0, 0); | private Point currentPositionP1 = new Point(0, 0); | ||||
private Point currentPositionP2 = new Point(0, 0); | private Point currentPositionP2 = new Point(0, 0); | ||||
Queue<int[]> trails = new LinkedList<>(); | Queue<int[]> trails = new LinkedList<>(); | ||||
private final int TRAIL_LENGTH = 200; | |||||
private final int TRAIL_LENGTH = 90; | |||||
private final CamPuffer camPuffer; | private final CamPuffer camPuffer; | ||||
private GraphicsProgram playerGraphics; | private GraphicsProgram playerGraphics; | ||||
public ImgAnalyzer(CamPuffer cP, int threshold) { | |||||
public ImgAnalyzer(CamPuffer cP, int threshold, GraphicsProgram graphicsProgram) { | |||||
THV = threshold; | THV = threshold; | ||||
camPuffer = cP; | camPuffer = cP; | ||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); | System.loadLibrary(Core.NATIVE_LIBRARY_NAME); | ||||
playerGraphics = new GraphicsProgram(); | |||||
String[] args ={"GraphicsProgram"}; | |||||
PApplet.runSketch(args, playerGraphics); | |||||
playerGraphics = graphicsProgram; | |||||
} | } | ||||
public static void main(String[] args) { | public static void main(String[] args) { | ||||
} | } | ||||
public void run() { | public void run() { | ||||
/* | |||||
while (camPuffer.getCurrentMat().elemSize() == 0) { | while (camPuffer.getCurrentMat().elemSize() == 0) { | ||||
System.out.println("Warten auf das erste Bild..."); | System.out.println("Warten auf das erste Bild..."); | ||||
try { | try { | ||||
return; | return; | ||||
} | } | ||||
} | } | ||||
*/ | |||||
Mat currentImg = new Mat(); | Mat currentImg = new Mat(); | ||||
Mat grayFrame = new Mat(); | Mat grayFrame = new Mat(); | ||||
if(trails.size() > TRAIL_LENGTH){ | if(trails.size() > TRAIL_LENGTH){ | ||||
trails.poll(); | 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); | |||||
} */ | |||||
} | } | ||||
} | } | ||||
// Finde Konturen | // Finde Konturen | ||||
Imgproc.findContours(thresholdFrame, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); | 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<Point> positions = new ArrayList<>(); | List<Point> positions = new ArrayList<>(); | ||||
List<Double> 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) { | if (moments.get_m00() != 0) { | ||||
// Berechne den Mittelpunkt der Kontur | |||||
int cx = (int) (moments.get_m10() / moments.get_m00()); | int cx = (int) (moments.get_m10() / moments.get_m00()); | ||||
int cy = (int) (moments.get_m01() / 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)); | positions.add(new Point(cx, cy)); | ||||
whitePixelCounts.add(whitePixels); | |||||
} | } | ||||
} | } | ||||
//Check | |||||
return positions; | |||||
// Sortiere die Positionen basierend auf der Anzahl weißer Pixel (absteigend) | |||||
List<Point> 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() { | public synchronized Point getP1() { | ||||
return currentPositionP1; | return currentPositionP1; | ||||
} | } |
private final int ID; | private final int ID; | ||||
private int x; | private int x; | ||||
private int y; | private int y; | ||||
private String name = "Thunfisch"; | |||||
private final int TRAIL_LENGTH; | |||||
Queue<int[]> trail = new LinkedList<>(); | Queue<int[]> trail = new LinkedList<>(); | ||||
ArduinoCommunication arduinoCommunicator; | |||||
private final int TRAIL_LENGTH = 30; | |||||
// Konstruktor | // Konstruktor | ||||
public Player(int id, String finalIpAddress, int finalPortNr) { | |||||
public Player(int id, int trailLength) { | |||||
this.ID = id; | this.ID = id; | ||||
arduinoCommunicator = new ArduinoCommunication(finalIpAddress, finalPortNr); | |||||
this.TRAIL_LENGTH = trailLength; | |||||
trail.add(new int[]{0,0}); | trail.add(new int[]{0,0}); | ||||
} | } | ||||
return y; | return y; | ||||
} | } | ||||
//fügt 2 Koordinaten zum Trail hinzu nd verhindert, dass dieser zulang wird | |||||
//fügt 2 Koordinaten zum Trail hinzu und verhindert, dass dieser zu lang wird | |||||
public void setKoords(int x, int y){ | public void setKoords(int x, int y){ | ||||
addToTrail(x,y); | addToTrail(x,y); | ||||
this.x = x; | this.x = x; | ||||
} | } | ||||
} | } | ||||
public Queue<int[]> getTrail(){ | public Queue<int[]> getTrail(){ | ||||
return trail; | return trail; | ||||
} | } | ||||
public void sendToCar(int light, double steer, double speed){ | |||||
arduinoCommunicator.sendMessage(light, steer, speed); | |||||
} | |||||
//gibt aktuelle Position aus | |||||
public void printPosition() { | |||||
System.out.println(trail); | |||||
} | |||||
} | } | ||||