diff --git a/.gitignore b/.gitignore index 12b3f0298..af64d4a70 100644 --- a/.gitignore +++ b/.gitignore @@ -113,6 +113,7 @@ chameleon-server/.classpath chameleon-server/.project chameleon-server/settings chameleon-server/dependency-reduced-pom.xml +chameleon-server/chameleon-vision.iml New client/chameleon-client/* diff --git a/chameleon-server/chameleon-vision.iml b/chameleon-server/chameleon-vision.iml deleted file mode 100644 index 4c5213fa3..000000000 --- a/chameleon-server/chameleon-vision.iml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/chameleon-server/src/main/java/com/chameleonvision/config/PipelineConfig.java b/chameleon-server/src/main/java/com/chameleonvision/config/PipelineConfig.java index e57ca250f..61376ed0e 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/config/PipelineConfig.java +++ b/chameleon-server/src/main/java/com/chameleonvision/config/PipelineConfig.java @@ -2,6 +2,8 @@ package com.chameleonvision.config; import com.chameleonvision.util.JacksonHelper; import com.chameleonvision.vision.pipeline.*; +import com.chameleonvision.vision.pipeline.impl.CVPipeline2dSettings; +import com.chameleonvision.vision.pipeline.impl.CVPipeline3dSettings; import java.io.File; import java.io.IOException; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java b/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java index 9d11db4fd..595d49905 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java @@ -3,10 +3,12 @@ package com.chameleonvision.vision; import com.chameleonvision.Debug; import com.chameleonvision.config.ConfigManager; import com.chameleonvision.util.LoopingRunnable; -import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.vision.camera.CameraStreamer; import com.chameleonvision.vision.camera.USBCameraCapture; import com.chameleonvision.vision.pipeline.*; +import com.chameleonvision.vision.pipeline.impl.CVPipeline2d; +import com.chameleonvision.vision.pipeline.impl.CVPipeline3d; +import com.chameleonvision.vision.pipeline.impl.DriverVisionPipeline; import com.chameleonvision.web.SocketHandler; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/enums/ImageRotationMode.java b/chameleon-server/src/main/java/com/chameleonvision/vision/enums/ImageRotationMode.java index c7920b46d..b22150aab 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/enums/ImageRotationMode.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/enums/ImageRotationMode.java @@ -13,4 +13,6 @@ public enum ImageRotationMode { ImageRotationMode(int value) { this.value = value; } + + public boolean isRotated(){return this.value==DEG_90.value||this.value==DEG_270.value;} } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java b/chameleon-server/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java index 8717bb88d..5bfa1ca46 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java @@ -14,7 +14,7 @@ public class CaptureProperties { public CaptureProperties(VideoMode videoMode, double fov) { staticProperties = new CaptureStaticProperties(videoMode, fov); } - + public void setStaticProperties(CaptureStaticProperties staticProperties) {this.staticProperties = staticProperties;} public CaptureStaticProperties getStaticProperties() { return staticProperties; } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline.java index 092939ace..9355636e7 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline.java @@ -1,6 +1,7 @@ package com.chameleonvision.vision.pipeline; import com.chameleonvision.vision.camera.CameraCapture; +import com.chameleonvision.vision.pipeline.impl.CVPipeline3d; import org.opencv.core.Mat; /** @@ -9,7 +10,7 @@ import org.opencv.core.Mat; */ public abstract class CVPipeline { protected Mat outputMat = new Mat(); - CameraCapture cameraCapture; + protected CameraCapture cameraCapture; public S settings; protected CVPipeline(S settings) { diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java index 7e6a942a1..b0a2649f7 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/PipelineManager.java @@ -4,6 +4,7 @@ import com.chameleonvision.config.CameraConfig; import com.chameleonvision.config.ConfigManager; import com.chameleonvision.vision.VisionManager; import com.chameleonvision.vision.VisionProcess; +import com.chameleonvision.vision.pipeline.impl.*; import com.chameleonvision.web.SocketHandler; import edu.wpi.first.networktables.NetworkTableEntry; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline2d.java similarity index 97% rename from chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java rename to chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline2d.java index d7b45bacf..aeb75f5d2 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline2d.java @@ -1,17 +1,18 @@ -package com.chameleonvision.vision.pipeline; +package com.chameleonvision.vision.pipeline.impl; import com.chameleonvision.Main; import com.chameleonvision.util.MemoryManager; import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.vision.camera.CaptureStaticProperties; -import com.chameleonvision.vision.enums.CalibrationMode; +import com.chameleonvision.vision.pipeline.CVPipeline; +import com.chameleonvision.vision.pipeline.CVPipelineResult; import com.chameleonvision.vision.pipeline.pipes.*; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.*; import java.util.List; -import static com.chameleonvision.vision.pipeline.CVPipeline2d.*; +import static com.chameleonvision.vision.pipeline.impl.CVPipeline2d.*; @SuppressWarnings("WeakerAccess") public class CVPipeline2d extends CVPipeline { diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2dSettings.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline2dSettings.java similarity index 91% rename from chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2dSettings.java rename to chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline2dSettings.java index 2f3be3ed8..4f023f16c 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2dSettings.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline2dSettings.java @@ -1,9 +1,10 @@ -package com.chameleonvision.vision.pipeline; +package com.chameleonvision.vision.pipeline.impl; import com.chameleonvision.vision.enums.CalibrationMode; import com.chameleonvision.vision.enums.SortMode; import com.chameleonvision.vision.enums.TargetGroup; import com.chameleonvision.vision.enums.TargetIntersection; +import com.chameleonvision.vision.pipeline.CVPipelineSettings; import java.util.Arrays; import java.util.List; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline3d.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline3d.java similarity index 68% rename from chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline3d.java rename to chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline3d.java index 7db893fef..503627c80 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline3d.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline3d.java @@ -1,19 +1,21 @@ -package com.chameleonvision.vision.pipeline; +package com.chameleonvision.vision.pipeline.impl; +import com.chameleonvision.vision.pipeline.CVPipeline; +import com.chameleonvision.vision.pipeline.CVPipelineResult; import org.opencv.core.Mat; import java.util.List; -import static com.chameleonvision.vision.pipeline.CVPipeline3d.*; +import static com.chameleonvision.vision.pipeline.impl.CVPipeline3d.*; public class CVPipeline3d extends CVPipeline { - protected CVPipeline3d(CVPipeline3dSettings settings) { + public CVPipeline3d(CVPipeline3dSettings settings) { super(settings); } - CVPipeline3d() { + public CVPipeline3d() { super(new CVPipeline3dSettings()); } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline3dSettings.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline3dSettings.java similarity index 82% rename from chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline3dSettings.java rename to chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline3dSettings.java index 342659ca1..70729f5b8 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline3dSettings.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/CVPipeline3dSettings.java @@ -1,4 +1,4 @@ -package com.chameleonvision.vision.pipeline; +package com.chameleonvision.vision.pipeline.impl; public class CVPipeline3dSettings extends CVPipeline2dSettings { // TODO: (2.1) define 3d-specific pipeline settings diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/DriverVisionPipeline.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/DriverVisionPipeline.java similarity index 71% rename from chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/DriverVisionPipeline.java rename to chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/DriverVisionPipeline.java index e00c156e4..1dcff6a30 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/DriverVisionPipeline.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/impl/DriverVisionPipeline.java @@ -1,9 +1,11 @@ -package com.chameleonvision.vision.pipeline; +package com.chameleonvision.vision.pipeline.impl; import com.chameleonvision.util.MemoryManager; import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.vision.enums.CalibrationMode; -import com.chameleonvision.vision.pipeline.pipes.Draw2dContoursPipe; +import com.chameleonvision.vision.pipeline.CVPipeline; +import com.chameleonvision.vision.pipeline.CVPipelineResult; +import com.chameleonvision.vision.pipeline.CVPipelineSettings; import com.chameleonvision.vision.pipeline.pipes.Draw2dCrosshairPipe; import com.chameleonvision.vision.pipeline.pipes.RotateFlipPipe; import org.apache.commons.lang3.tuple.Pair; @@ -12,16 +14,13 @@ import org.opencv.core.RotatedRect; import java.util.List; -import static com.chameleonvision.vision.pipeline.DriverVisionPipeline.DriverPipelineResult; +import static com.chameleonvision.vision.pipeline.impl.DriverVisionPipeline.DriverPipelineResult; public class DriverVisionPipeline extends CVPipeline { private RotateFlipPipe rotateFlipPipe; -// private Draw2dContoursPipe draw2dContoursPipe; -// private Draw2dContoursPipe.Draw2dContoursSettings draw2dContoursSettings = new Draw2dContoursPipe.Draw2dContoursSettings(); private Draw2dCrosshairPipe drawCrosshairPipe; private Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings crosshairPipeSettings = new Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings(); - private final List blankList = List.of(); private final MemoryManager memoryManager = new MemoryManager(200, 20000); @@ -36,18 +35,14 @@ public class DriverVisionPipeline extends CVPipeline rotateFlipResult = rotateFlipPipe.run(inputMat); -// Pair draw2dContoursResult = draw2dContoursPipe.run(Pair.of(rotateFlipResult.getLeft(), blankList)); Pair draw2dCrosshairResult = drawCrosshairPipe.run(Pair.of(rotateFlipResult.getLeft(),null)); memoryManager.run(); diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java index 3d30f7d72..cafa503c6 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java @@ -1,12 +1,10 @@ package com.chameleonvision.vision.pipeline.pipes; import com.chameleonvision.vision.camera.CaptureStaticProperties; -import com.chameleonvision.vision.pipeline.CVPipeline2d; +import com.chameleonvision.vision.pipeline.impl.CVPipeline2d; import com.chameleonvision.vision.enums.CalibrationMode; -import com.chameleonvision.vision.pipeline.CVPipeline2dSettings; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.math3.util.FastMath; -import org.opencv.core.Mat; import org.opencv.core.RotatedRect; import java.util.ArrayList; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dCrosshairPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dCrosshairPipe.java index d0834420a..4f5ed80c5 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dCrosshairPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dCrosshairPipe.java @@ -1,10 +1,8 @@ package com.chameleonvision.vision.pipeline.pipes; import com.chameleonvision.util.Helpers; -import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.vision.enums.CalibrationMode; -import com.chameleonvision.vision.pipeline.CVPipeline2d; -import com.chameleonvision.vision.pipeline.CVPipeline2dSettings; +import com.chameleonvision.vision.pipeline.impl.CVPipeline2d; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Mat; import org.opencv.core.Point; diff --git a/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java b/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java index 0adf079f2..b5e91fbe3 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java @@ -4,13 +4,17 @@ import com.chameleonvision.config.ConfigManager; import com.chameleonvision.vision.VisionManager; import com.chameleonvision.vision.VisionProcess; import com.chameleonvision.vision.camera.CameraCapture; +import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.vision.camera.USBCameraCapture; +import com.chameleonvision.vision.enums.ImageRotationMode; import com.chameleonvision.vision.enums.StreamDivisor; import com.chameleonvision.vision.pipeline.CVPipeline; +import com.chameleonvision.vision.pipeline.impl.CVPipeline2d; import com.chameleonvision.vision.pipeline.CVPipelineSettings; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import edu.wpi.cscore.VideoMode; import io.javalin.websocket.WsBinaryMessageContext; import io.javalin.websocket.WsCloseContext; import io.javalin.websocket.WsConnectContext; @@ -20,10 +24,8 @@ import org.msgpack.jackson.dataformat.MessagePackFactory; import java.lang.reflect.Field; import java.nio.ByteBuffer; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.*; import java.util.List; -import java.util.Map; public class SocketHandler { @@ -136,13 +138,35 @@ public class SocketHandler { } default: { - // only change settings when we aren't in driver mode - if(currentProcess.pipelineManager.getDriverMode()) { + switch (entry.getKey()) {//Pre field value set + case "rotationMode": {//Create new CaptureStaticProperties with new width and height, reset crosshair calib + ImageRotationMode oldRot = currentPipeline.settings.rotationMode; + ImageRotationMode newRot = ImageRotationMode.class.getEnumConstants()[(Integer)entry.getValue()]; + CaptureStaticProperties prop = currentCamera.getProperties().getStaticProperties(); + int width, height; + if(oldRot.isRotated()!=newRot.isRotated()){ + width = prop.mode.height; + height = prop.mode.width; + //Creates new video mode with new width and height to create new CaptureStaticProperties and applies it + currentCamera.getProperties().setStaticProperties(new CaptureStaticProperties( + new VideoMode(prop.mode.pixelFormat, width, height, prop.mode.fps), prop.fov)); + } + prop = currentCamera.getProperties().getStaticProperties(); + if (currentPipeline instanceof CVPipeline2d) + ((CVPipeline2d) currentPipeline).settings.point = Arrays.asList(prop.mode.width / 2, prop.mode.height / 2);//Reset Crosshair in single point calib + break; + } + + } + + + if (currentProcess.pipelineManager.getDriverMode()) { setField(currentProcess.pipelineManager.driverModePipeline.settings, entry.getKey(), entry.getValue()); } else { setField(currentPipeline.settings, entry.getKey(), entry.getValue()); } + //Post field value set switch (entry.getKey()) { case "exposure": { currentCamera.setExposure((Integer) entry.getValue()); @@ -152,11 +176,13 @@ public class SocketHandler { currentCamera.setBrightness((Integer) entry.getValue()); break; } - case "videoModeIndex":{ + case "videoModeIndex": { + if (currentPipeline instanceof CVPipeline2d) + ((CVPipeline2d) currentPipeline).settings.point = new ArrayList<>();//This will reset the calibration currentCamera.setVideoMode((Integer) entry.getValue()); break; } - case "streamDivisor":{ + case "streamDivisor": { currentProcess.cameraStreamer.setDivisor(StreamDivisor.values()[(Integer) entry.getValue()], true); break; } diff --git a/chameleon-server/src/test/java/com/chameleonvision/config/StaticCaptureTest.java b/chameleon-server/src/test/java/com/chameleonvision/config/StaticCaptureTest.java index 93ead0087..845fd2fda 100644 --- a/chameleon-server/src/test/java/com/chameleonvision/config/StaticCaptureTest.java +++ b/chameleon-server/src/test/java/com/chameleonvision/config/StaticCaptureTest.java @@ -3,7 +3,7 @@ package com.chameleonvision.config; import com.chameleonvision.util.ProgramDirectoryUtilities; import com.chameleonvision.vision.camera.CameraStreamer; import com.chameleonvision.vision.image.StaticImageCapture; -import com.chameleonvision.vision.pipeline.CVPipeline2d; +import com.chameleonvision.vision.pipeline.impl.CVPipeline2d; import edu.wpi.cscore.CameraServerCvJNI; import edu.wpi.cscore.CameraServerJNI; import edu.wpi.first.networktables.NetworkTableInstance; @@ -17,7 +17,6 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List;