diff --git a/Main/chameleon-vision.iml b/Main/chameleon-vision.iml index 7ef49e681..5cbae1d91 100644 --- a/Main/chameleon-vision.iml +++ b/Main/chameleon-vision.iml @@ -12,24 +12,13 @@ - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/Main/src/main/java/com/chameleonvision/Main.java b/Main/src/main/java/com/chameleonvision/Main.java index ff32ba8d0..9bc4d4da7 100644 --- a/Main/src/main/java/com/chameleonvision/Main.java +++ b/Main/src/main/java/com/chameleonvision/Main.java @@ -24,7 +24,7 @@ public class Main { private static final String IGNORE_ROOT_KEY = "--ignore-root"; // no args for this setting private static final String TEST_MODE_KEY = "--cv-development"; - private static final int DEFAULT_PORT = 5800; + private static final int DEFAULT_PORT = 8888; private static boolean ntServerMode = false; private static boolean manageNetwork = true; diff --git a/Main/src/main/java/com/chameleonvision/config/CameraConfig.java b/Main/src/main/java/com/chameleonvision/config/CameraConfig.java index e4162bec3..b416eb65d 100644 --- a/Main/src/main/java/com/chameleonvision/config/CameraConfig.java +++ b/Main/src/main/java/com/chameleonvision/config/CameraConfig.java @@ -1,6 +1,6 @@ package com.chameleonvision.config; -import com.chameleonvision.vision.camera.USBCameraProcess; +import com.chameleonvision.vision.camera.USBCameraCapture; import com.chameleonvision.vision.camera.USBCameraProperties; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -30,7 +30,7 @@ public class CameraConfig { this.nickname = name; } - public static CameraConfig fromUSBCameraProcess(USBCameraProcess process) { + public static CameraConfig fromUSBCameraProcess(USBCameraCapture process) { USBCameraProperties camProps = process.getProperties(); return new CameraConfig(camProps.FOV, camProps.name, camProps.path, camProps.getNickname()); } diff --git a/Main/src/main/java/com/chameleonvision/config/ConfigManager.java b/Main/src/main/java/com/chameleonvision/config/ConfigManager.java index dc5b30660..68212fc78 100644 --- a/Main/src/main/java/com/chameleonvision/config/ConfigManager.java +++ b/Main/src/main/java/com/chameleonvision/config/ConfigManager.java @@ -4,6 +4,7 @@ import com.chameleonvision.util.ProgramDirectoryUtilities; import com.chameleonvision.util.FileHelper; import com.chameleonvision.vision.pipeline.CVPipelineSettings; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -34,7 +35,8 @@ public class ConfigManager { } private static void checkSettingsFile() { - if (!settingsFileExists()) { + boolean settingsFileEmpty = settingsFileExists() && new File(settingsFilePath.toString()).length() == 0; + if (settingsFileEmpty || !settingsFileExists()) { try { FileHelper.Serializer(settingsFilePath, settings); } catch (IOException e) { diff --git a/Main/src/main/java/com/chameleonvision/vision/VisionManager.java b/Main/src/main/java/com/chameleonvision/vision/VisionManager.java index b74708265..b0b148796 100644 --- a/Main/src/main/java/com/chameleonvision/vision/VisionManager.java +++ b/Main/src/main/java/com/chameleonvision/vision/VisionManager.java @@ -4,8 +4,8 @@ import com.chameleonvision.config.CameraConfig; import com.chameleonvision.config.ConfigManager; import com.chameleonvision.util.Helpers; import com.chameleonvision.util.Platform; -import com.chameleonvision.vision.camera.CameraProcess; -import com.chameleonvision.vision.camera.USBCameraProcess; +import com.chameleonvision.vision.camera.CameraCapture; +import com.chameleonvision.vision.camera.USBCameraCapture; import com.chameleonvision.vision.pipeline.CVPipelineSettings; import edu.wpi.cscore.UsbCamera; import edu.wpi.cscore.UsbCameraInfo; @@ -86,7 +86,7 @@ public class VisionManager { public static boolean initializeProcesses() { for (int i = 0; i < loadedCameraConfigs.size(); i++) { CameraConfig config = loadedCameraConfigs.get(i); - CameraProcess camera = new USBCameraProcess(config); + CameraCapture camera = new USBCameraCapture(config); VisionProcess process = new VisionProcess(camera, config.name); visionProcesses.add(new VisionProcessManageable(i, config.name, process)); } @@ -136,7 +136,7 @@ public class VisionManager { String cameraName = process.getCamera().getProperties().name; List pipelines = process.getPipelines().stream().map(cvPipeline -> cvPipeline.settings).collect(Collectors.toList()); CVPipelineSettings driverMode = process.getDriverModeSettings(); - CameraConfig config = CameraConfig.fromUSBCameraProcess((USBCameraProcess) process.getCamera()); + CameraConfig config = CameraConfig.fromUSBCameraProcess((USBCameraCapture) process.getCamera()); try { ConfigManager.saveCameraPipelines(cameraName, pipelines); ConfigManager.saveCameraDriverMode(cameraName, driverMode); diff --git a/Main/src/main/java/com/chameleonvision/vision/VisionProcess.java b/Main/src/main/java/com/chameleonvision/vision/VisionProcess.java index 3cb5c8ad1..30589dc71 100644 --- a/Main/src/main/java/com/chameleonvision/vision/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/VisionProcess.java @@ -2,7 +2,7 @@ package com.chameleonvision.vision; import com.chameleonvision.config.ConfigManager; import com.chameleonvision.util.LoopingRunnable; -import com.chameleonvision.vision.camera.CameraProcess; +import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.vision.camera.CameraStreamer; import com.chameleonvision.vision.pipeline.*; import com.chameleonvision.web.ServerHandler; @@ -19,7 +19,7 @@ import java.util.List; public class VisionProcess { - private final CameraProcess cameraProcess; + private final CameraCapture cameraCapture; private final List pipelines = new ArrayList<>(); private final CameraFrameRunnable cameraRunnable; private final CameraStreamerRunnable streamRunnable; @@ -51,29 +51,29 @@ public class VisionProcess { private NetworkTableEntry ntValidEntry; private Gson gson = new GsonBuilder().setPrettyPrinting().create(); - VisionProcess(CameraProcess cameraProcess, String name) { - this.cameraProcess = cameraProcess; + VisionProcess(CameraCapture cameraCapture, String name) { + this.cameraCapture = cameraCapture; pipelines.add(new CVPipeline2d("New Pipeline")); setPipeline(0, false); // Thread to grab frames from the camera // TODO: (HIGH) fix video modes!!! - this.cameraRunnable = new CameraFrameRunnable(cameraProcess.getProperties().videoModes.get(0).fps); + this.cameraRunnable = new CameraFrameRunnable(cameraCapture.getProperties().videoModes.get(0).fps); lastPipelineResult = new DriverVisionPipeline.DriverPipelineResult( null, cameraRunnable.getFrame(new Mat()), 0 ); // Thread to put frames on the dashboard - this.cameraStreamer = new CameraStreamer(cameraProcess, name); + this.cameraStreamer = new CameraStreamer(cameraCapture, name); this.streamRunnable = new CameraStreamerRunnable(30, cameraStreamer); // Thread to process vision data this.visionRunnable = new VisionProcessRunnable(); // network table - defaultTable = NetworkTableInstance.getDefault().getTable("/chameleon-vision/" + cameraProcess.getProperties().name); + defaultTable = NetworkTableInstance.getDefault().getTable("/chameleon-vision/" + cameraCapture.getProperties().name); } public void start() { @@ -156,7 +156,7 @@ public class VisionProcess { currentPipelineIndex = pipelineIndex; // update the configManager - if(ConfigManager.settings.currentCamera.equals(cameraProcess.getProperties().name)) { + if(ConfigManager.settings.currentCamera.equals(cameraCapture.getProperties().name)) { ConfigManager.settings.currentPipeline = pipelineIndex; if (updateUI) { @@ -171,11 +171,11 @@ public class VisionProcess { private void setPipelineInternal(CVPipeline pipeline) { currentPipeline = pipeline; - currentPipeline.initPipeline(cameraProcess); + currentPipeline.initPipeline(cameraCapture); } private void updateUI(CVPipelineResult data) { - if(cameraProcess.getProperties().name.equals(ConfigManager.settings.currentCamera)) { + if(cameraCapture.getProperties().name.equals(ConfigManager.settings.currentCamera)) { HashMap WebSend = new HashMap<>(); HashMap point = new HashMap<>(); HashMap calculated = new HashMap<>(); @@ -235,7 +235,7 @@ public class VisionProcess { } public void setVideoMode(VideoMode newMode) { - cameraProcess.setVideoMode(newMode); + cameraCapture.setVideoMode(newMode); cameraRunnable.updateCameraFPS(newMode.fps); cameraStreamer.setNewVideoMode(newMode); } @@ -261,8 +261,8 @@ public class VisionProcess { pipelines.add(pipeline); } - public CameraProcess getCamera() { - return cameraProcess; + public CameraCapture getCamera() { + return cameraCapture; } public boolean getDriverMode() { @@ -304,10 +304,9 @@ public class VisionProcess { @Override public void process() { -// System.out.println("running camera grabber process"); // Grab camera frames - var camData = cameraProcess.getFrame(); + var camData = cameraCapture.getFrame(); if (camData.getLeft().cols() > 0) { // System.out.println("grabbing frame"); // synchronized (frameLock) { diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraProcess.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraCapture.java similarity index 67% rename from Main/src/main/java/com/chameleonvision/vision/camera/CameraProcess.java rename to Main/src/main/java/com/chameleonvision/vision/camera/CameraCapture.java index ef9d4a7bb..2233eb2cc 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraCapture.java @@ -1,18 +1,11 @@ package com.chameleonvision.vision.camera; +import com.chameleonvision.vision.image.ImageCapture; import edu.wpi.cscore.VideoMode; -import org.apache.commons.lang3.tuple.Pair; -import org.opencv.core.Mat; -public interface CameraProcess { +public interface CameraCapture extends ImageCapture { USBCameraProperties getProperties(); - /** - * Get the next camera frame - * @return a Pair of the captured image and how long it took to grab the frame (in uS) - */ - Pair getFrame(); - /** * Set the exposure of the camera * @param exposure the new exposure to set the camera to diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraStreamer.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraStreamer.java index 249e0f425..1a2e68aa6 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraStreamer.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraStreamer.java @@ -10,32 +10,32 @@ import org.opencv.core.CvType; import org.opencv.core.Mat; public class CameraStreamer { - private final CameraProcess cameraProcess; + private final CameraCapture cameraCapture; private final String name; private StreamDivisor divisor = StreamDivisor.NONE; private CvSource cvSource; private final Object streamBufferLock = new Object(); private Mat streamBuffer = new Mat(); - public CameraStreamer(CameraProcess cameraProcess, String name) { - this.cameraProcess = cameraProcess; + public CameraStreamer(CameraCapture cameraCapture, String name) { + this.cameraCapture = cameraCapture; this.name = name; this.cvSource = CameraServer.getInstance().putVideo(name, - cameraProcess.getProperties().staticProperties.imageWidth / divisor.value, - cameraProcess.getProperties().staticProperties.imageHeight / divisor.value); + cameraCapture.getProperties().getStaticProperties().imageWidth / divisor.value, + cameraCapture.getProperties().getStaticProperties().imageHeight / divisor.value); setDivisor(divisor, false); } public void setDivisor(StreamDivisor newDivisor, boolean updateUI) { this.divisor = newDivisor; - var camValues = cameraProcess.getProperties(); - var newWidth = camValues.staticProperties.imageWidth / newDivisor.value; - var newHeight = camValues.staticProperties.imageHeight / newDivisor.value; + var camValues = cameraCapture.getProperties(); + var newWidth = camValues.getStaticProperties().imageWidth / newDivisor.value; + var newHeight = camValues.getStaticProperties().imageHeight / newDivisor.value; synchronized (streamBufferLock) { this.streamBuffer = new Mat(newWidth, newHeight, CvType.CV_8UC3); this.cvSource = CameraServer.getInstance().putVideo(this.name, - cameraProcess.getProperties().staticProperties.imageWidth / divisor.value, - cameraProcess.getProperties().staticProperties.imageHeight / divisor.value); + cameraCapture.getProperties().getStaticProperties().imageWidth / divisor.value, + cameraCapture.getProperties().getStaticProperties().imageHeight / divisor.value); } if (updateUI) { ServerHandler.sendFullSettings(); diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraStaticProperties.java b/Main/src/main/java/com/chameleonvision/vision/camera/CaptureStaticProperties.java similarity index 92% rename from Main/src/main/java/com/chameleonvision/vision/camera/CameraStaticProperties.java rename to Main/src/main/java/com/chameleonvision/vision/camera/CaptureStaticProperties.java index 5ab0e17d8..4c991f5d6 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraStaticProperties.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/CaptureStaticProperties.java @@ -3,7 +3,7 @@ package com.chameleonvision.vision.camera; import org.apache.commons.math3.fraction.Fraction; import org.apache.commons.math3.util.FastMath; -public class CameraStaticProperties { +public class CaptureStaticProperties { public final int imageWidth; public final int imageHeight; @@ -14,7 +14,7 @@ public class CameraStaticProperties { public final double horizontalFocalLength; public final double verticalFocalLength; - public CameraStaticProperties(int imageWidth, int imageHeight, double fov) { + public CaptureStaticProperties(int imageWidth, int imageHeight, double fov) { this.imageWidth = imageWidth; this.imageHeight = imageHeight; this.fov = fov; diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/USBCameraProcess.java b/Main/src/main/java/com/chameleonvision/vision/camera/USBCameraCapture.java similarity index 94% rename from Main/src/main/java/com/chameleonvision/vision/camera/USBCameraProcess.java rename to Main/src/main/java/com/chameleonvision/vision/camera/USBCameraCapture.java index 4db1bcab7..b3391bee8 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/USBCameraProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/USBCameraCapture.java @@ -9,13 +9,13 @@ import edu.wpi.first.cameraserver.CameraServer; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Mat; -public class USBCameraProcess implements CameraProcess { +public class USBCameraCapture implements CameraCapture { private final UsbCamera baseCamera; private final CvSink cvSink; private Mat imageBuffer = new Mat(); private USBCameraProperties properties; - public USBCameraProcess(CameraConfig config) { + public USBCameraCapture(CameraConfig config) { baseCamera = new UsbCamera(config.name, config.path); cvSink = CameraServer.getInstance().getVideo(baseCamera); properties = new USBCameraProperties(baseCamera, config); diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/USBCameraProperties.java b/Main/src/main/java/com/chameleonvision/vision/camera/USBCameraProperties.java index 28e27b785..e91fe825b 100644 --- a/Main/src/main/java/com/chameleonvision/vision/camera/USBCameraProperties.java +++ b/Main/src/main/java/com/chameleonvision/vision/camera/USBCameraProperties.java @@ -2,9 +2,9 @@ package com.chameleonvision.vision.camera; import com.chameleonvision.config.CameraConfig; import com.chameleonvision.util.Platform; +import com.chameleonvision.vision.image.CaptureProperties; import edu.wpi.cscore.UsbCamera; import edu.wpi.cscore.VideoMode; -import org.apache.commons.math3.util.FastMath; import java.util.Arrays; import java.util.List; @@ -12,7 +12,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -public class USBCameraProperties { +public class USBCameraProperties extends CaptureProperties { public static final double DEFAULT_FOV = 70; private static final int DEFAULT_EXPOSURE = 50; private static final int DEFAULT_BRIGHTNESS = 50; @@ -26,19 +26,18 @@ public class USBCameraProperties { private static final Predicate kMinSizePredicate = (videoMode -> videoMode.width >= MINIMUM_WIDTH && videoMode.height >= MINIMUM_HEIGHT); private static final Predicate kPixelFormatPredicate = (videoMode -> ALLOWED_PIXEL_FORMATS.contains(videoMode.pixelFormat)); - public CameraStaticProperties staticProperties; public final String name; public final String path; public final List videoModes; private final UsbCamera baseCamera; + private final boolean hasGain; private String nickname; public double FOV; - public final boolean hasGain; - public USBCameraProperties(UsbCamera baseCamera, CameraConfig config) { + USBCameraProperties(UsbCamera baseCamera, CameraConfig config) { FOV = config.fov; name = config.name; path = config.path; @@ -86,17 +85,8 @@ public class USBCameraProperties { return validModes.collect(Collectors.toList()); } - public void updateVideoMode(VideoMode videoMode) { - staticProperties = new CameraStaticProperties(videoMode.width, videoMode.height, FOV); - } - - public double calculatePitch(double PixelY, double centerY) { - double pitch = FastMath.toDegrees(FastMath.atan((PixelY - centerY) / staticProperties.verticalFocalLength)); - return (pitch * -1); - } - - public double calculateYaw(double PixelX, double centerX) { - return FastMath.toDegrees(FastMath.atan((PixelX - centerX) / staticProperties.horizontalFocalLength)); + void updateVideoMode(VideoMode videoMode) { + staticProperties = new CaptureStaticProperties(videoMode.width, videoMode.height, FOV); } public List getVideoModes() { diff --git a/Main/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java b/Main/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java new file mode 100644 index 000000000..139023fcd --- /dev/null +++ b/Main/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java @@ -0,0 +1,20 @@ +package com.chameleonvision.vision.image; + +import com.chameleonvision.vision.camera.CaptureStaticProperties; +import org.opencv.core.Mat; + +public class CaptureProperties { + + protected CaptureStaticProperties staticProperties; + + protected CaptureProperties() { + } + + public CaptureProperties(Mat staticImage, double fov) { + staticProperties = new CaptureStaticProperties(staticImage.cols(), staticImage.rows(), fov); + } + + public CaptureStaticProperties getStaticProperties() { + return staticProperties; + } +} diff --git a/Main/src/main/java/com/chameleonvision/vision/image/ImageCapture.java b/Main/src/main/java/com/chameleonvision/vision/image/ImageCapture.java new file mode 100644 index 000000000..1d7b3820e --- /dev/null +++ b/Main/src/main/java/com/chameleonvision/vision/image/ImageCapture.java @@ -0,0 +1,12 @@ +package com.chameleonvision.vision.image; + +import org.apache.commons.lang3.tuple.Pair; +import org.opencv.core.Mat; + +public interface ImageCapture { + /** + * Get the next camera frame + * @return a Pair of the captured image and the Linux epoch of when the frame was grabbed (in uS) + */ + Pair getFrame(); +} diff --git a/Main/src/main/java/com/chameleonvision/vision/image/StaticImageCapture.java b/Main/src/main/java/com/chameleonvision/vision/image/StaticImageCapture.java new file mode 100644 index 000000000..3f738f118 --- /dev/null +++ b/Main/src/main/java/com/chameleonvision/vision/image/StaticImageCapture.java @@ -0,0 +1,32 @@ +package com.chameleonvision.vision.image; + +import org.apache.commons.lang3.tuple.Pair; +import org.opencv.core.Mat; +import org.opencv.imgcodecs.Imgcodecs; + +import java.nio.file.Files; +import java.nio.file.Path; + +public class StaticImageCapture implements ImageCapture { + + private final Mat image = new Mat(); + + public StaticImageCapture(Path imagePath) { + if (!Files.exists(imagePath)) throw new RuntimeException("Invalid path for image!"); + + Mat tempMat = new Mat(); + + try { + tempMat = Imgcodecs.imread(imagePath.toString()); + } catch (Exception e) { + System.err.println("Failed to read image!"); + } finally { + tempMat.copyTo(image); + } + } + + @Override + public Pair getFrame() { + return Pair.of(image, System.nanoTime()); + } +} diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline.java index a56c03e47..9b27f65d2 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline.java @@ -1,6 +1,6 @@ package com.chameleonvision.vision.pipeline; -import com.chameleonvision.vision.camera.CameraProcess; +import com.chameleonvision.vision.camera.CameraCapture; import org.opencv.core.Mat; /** @@ -9,7 +9,7 @@ import org.opencv.core.Mat; */ public abstract class CVPipeline { protected Mat outputMat = new Mat(); - CameraProcess cameraProcess; + CameraCapture cameraCapture; public final S settings; protected CVPipeline(S settings) { @@ -21,10 +21,10 @@ public abstract class CVPipeline { public Pair run(Mat input) { long processStartNanos = System.nanoTime(); - input.copyTo(processBuffer); - - try { - if (blurSize > 0) { + if (blurSize > 0) { + input.copyTo(processBuffer); + try { Imgproc.blur(processBuffer, processBuffer, new Size(blurSize, blurSize)); + processBuffer.copyTo(outputMat); + } catch (CvException e) { + System.err.println("(BlurPipe) Exception thrown by OpenCV: \n" + e.getMessage()); } - } catch (CvException e) { - System.err.println("(BlurPipe) Exception thrown by OpenCV: \n" + e.getMessage()); + } else { + input.copyTo(outputMat); } + long processTime = System.nanoTime() - processStartNanos; - processBuffer.copyTo(outputMat); Pair output = Pair.of(outputMat, processTime); processBuffer.release(); - return output; } } diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java index 51747cfdd..87a627fc2 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java @@ -1,6 +1,6 @@ package com.chameleonvision.vision.pipeline.pipes; -import com.chameleonvision.vision.camera.CameraStaticProperties; +import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.vision.pipeline.CVPipeline2d; import com.chameleonvision.vision.enums.CalibrationMode; import org.apache.commons.lang3.tuple.Pair; @@ -13,14 +13,14 @@ import java.util.List; public class Collect2dTargetsPipe implements Pipe, List> { private CalibrationMode calibrationMode; - private CameraStaticProperties camProps; + private CaptureStaticProperties camProps; private List calibrationPoint; private double calibrationM, calibrationB; private List targets = new ArrayList<>(); public Collect2dTargetsPipe(CalibrationMode calibrationMode, List calibrationPoint, - double calibrationM, double calibrationB, CameraStaticProperties camProps) { + double calibrationM, double calibrationB, CaptureStaticProperties camProps) { this.calibrationMode = calibrationMode; this.camProps = camProps; this.calibrationPoint = calibrationPoint; @@ -29,7 +29,7 @@ public class Collect2dTargetsPipe implements Pipe, List calibrationPoint, - double calibrationM, double calibrationB, CameraStaticProperties camProps) { + double calibrationM, double calibrationB, CaptureStaticProperties camProps) { this.calibrationMode = calibrationMode; this.camProps = camProps; this.calibrationPoint = calibrationPoint; diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java index ebbab7d1b..6b95ca930 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java @@ -1,6 +1,6 @@ package com.chameleonvision.vision.pipeline.pipes; -import com.chameleonvision.vision.camera.CameraStaticProperties; +import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.util.Helpers; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Point; @@ -14,11 +14,11 @@ import java.util.List; public class Draw2dContoursPipe implements Pipe>, Mat> { private final Draw2dContoursSettings settings; - private final CameraStaticProperties camProps; + private final CaptureStaticProperties camProps; private Mat outputMat = new Mat(); - public Draw2dContoursPipe(Draw2dContoursSettings settings, CameraStaticProperties camProps) { + public Draw2dContoursPipe(Draw2dContoursSettings settings, CaptureStaticProperties camProps) { this.settings = settings; this.camProps = camProps; } diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/FilterContoursPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/FilterContoursPipe.java index 97acea6aa..9870e43a5 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/FilterContoursPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/FilterContoursPipe.java @@ -1,6 +1,6 @@ package com.chameleonvision.vision.pipeline.pipes; -import com.chameleonvision.vision.camera.CameraStaticProperties; +import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.util.MathHandler; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.MatOfPoint; @@ -16,18 +16,18 @@ public class FilterContoursPipe implements Pipe, List area; private List ratio; private List extent; - private CameraStaticProperties camProps; + private CaptureStaticProperties camProps; private List filteredContours = new ArrayList<>(); - public FilterContoursPipe(List area, List ratio, List extent, CameraStaticProperties camProps) { + public FilterContoursPipe(List area, List ratio, List extent, CaptureStaticProperties camProps) { this.area = area; this.ratio = ratio; this.extent = extent; this.camProps = camProps; } - public void setConfig(List area, List ratio, List extent, CameraStaticProperties camProps) { + public void setConfig(List area, List ratio, List extent, CaptureStaticProperties camProps) { this.area = area; this.ratio = ratio; this.extent = extent; diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/SortContoursPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/SortContoursPipe.java index a6e28f1c7..329b848a2 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/SortContoursPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/SortContoursPipe.java @@ -1,6 +1,6 @@ package com.chameleonvision.vision.pipeline.pipes; -import com.chameleonvision.vision.camera.CameraStaticProperties; +import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.vision.enums.SortMode; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.math3.util.FastMath; @@ -25,16 +25,16 @@ public class SortContoursPipe implements Pipe, List sortedContours = new ArrayList<>(); - public SortContoursPipe(SortMode sort, CameraStaticProperties camProps) { + public SortContoursPipe(SortMode sort, CaptureStaticProperties camProps) { this.sort = sort; this.camProps = camProps; } - public void setConfig(SortMode sort, CameraStaticProperties camProps) { + public void setConfig(SortMode sort, CaptureStaticProperties camProps) { this.sort = sort; this.camProps = camProps; } diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java index 35006e66e..b3608b02d 100644 --- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java +++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java @@ -3,7 +3,7 @@ package com.chameleonvision.web; import com.chameleonvision.config.GeneralSettings; import com.chameleonvision.vision.VisionManager; import com.chameleonvision.vision.VisionProcess; -import com.chameleonvision.vision.camera.CameraProcess; +import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.config.ConfigManager; import com.chameleonvision.vision.enums.CalibrationMode; import com.chameleonvision.vision.pipeline.CVPipeline; @@ -38,22 +38,23 @@ public class ServerHandler { sendFullSettings(); } - public void onClose(WsCloseContext context) { + void onClose(WsCloseContext context) { users.remove(context); } + @SuppressWarnings("unchecked") void onBinaryMessage(WsBinaryMessageContext context) throws Exception { - Map deserialized = objectMapper.readValue(ArrayUtils.toPrimitive(context.data()), new TypeReference>() { + Map deserialized = objectMapper.readValue(ArrayUtils.toPrimitive(context.data()), new TypeReference<>() { }); for (Map.Entry entry : deserialized.entrySet()) { try { - var data = (HashMap) entry.getValue(); VisionProcess currentProcess = VisionManager.getCurrentUIVisionProcess(); - CameraProcess currentCamera = currentProcess.getCamera(); + CameraCapture currentCamera = currentProcess.getCamera(); CVPipeline currentPipeline = currentProcess.getCurrentPipeline(); switch (entry.getKey()) { case "generalSettings": { + HashMap data = (HashMap) entry.getValue(); for (HashMap.Entry e : data.entrySet()) { setField(ConfigManager.settings, e.getKey(), e.getValue()); } @@ -62,6 +63,7 @@ public class ServerHandler { break; } case "driverMode": { + HashMap data = (HashMap) entry.getValue(); currentProcess.getDriverModeSettings().exposure = (Integer) data.get("exposure"); currentProcess.getDriverModeSettings().brightness = (Integer) data.get("brightness"); currentProcess.setDriverMode((Boolean) data.get("isDriver")); @@ -74,7 +76,7 @@ public class ServerHandler { Number newFOV = (Number) camSettings.get("fov"); StreamDivisor newStreamDivisor = StreamDivisor.values()[(Integer) camSettings.get("streamDivisor")]; - Integer newResolution = (Integer) camSettings.get("resolution"); +// Integer newResolution = (Integer) camSettings.get("resolution"); currentCamera.getProperties().FOV = (double) newFOV; @@ -119,7 +121,6 @@ public class ServerHandler { } else { currentProcess.addPipeline(origPipeline); } - // TODO: (HIGH) switch to ConfigManager ConfigManager.saveSettings(); break; } @@ -128,7 +129,6 @@ public class ServerHandler { case "addNewPipeline": currentProcess.addPipeline(); sendFullSettings(); - // TODO: (HIGH) switch to ConfigManager ConfigManager.saveSettings(); break; // TODO: (HIGH) this never worked before, re-visit now that VisionProcess is written sanely @@ -146,7 +146,6 @@ public class ServerHandler { // ConfigManager.saveSettings(); break; case "save": - // TODO: (HIGH) switch to ConfigManager ConfigManager.saveSettings(); System.out.println("saved Settings"); break; @@ -155,7 +154,6 @@ public class ServerHandler { break; } case "currentCamera": { - // TODO: (HIGH) find way to map cameras to indexes VisionManager.setCurrentProcessByIndex((Integer) entry.getValue()); sendFullSettings(); break; @@ -254,7 +252,7 @@ public class ServerHandler { private static HashMap getOrdinalCameraSettings() { HashMap tmp = new HashMap<>(); VisionProcess currentVisionProcess = VisionManager.getCurrentUIVisionProcess(); - CameraProcess currentCamera = VisionManager.getCurrentUIVisionProcess().getCamera(); + CameraCapture currentCamera = VisionManager.getCurrentUIVisionProcess().getCamera(); tmp.put("fov", currentCamera.getProperties().FOV); tmp.put("streamDivisor", currentVisionProcess.cameraStreamer.getDivisor().ordinal()); // TODO: (HIGH) get videomode index! @@ -316,7 +314,7 @@ public class ServerHandler { Map fullSettings = new HashMap<>(); VisionProcess currentProcess = VisionManager.getCurrentUIVisionProcess(); - CameraProcess currentCamera = currentProcess.getCamera(); + CameraCapture currentCamera = currentProcess.getCamera(); CVPipeline currentPipeline = currentProcess.getCurrentPipeline(); try { @@ -327,7 +325,6 @@ public class ServerHandler { fullSettings.put("cameraList", VisionManager.getAllCameraNicknames()); fullSettings.put("pipeline", getOrdinalPipeline()); fullSettings.put("driverMode", getOrdinalDriver()); - // TODO (HIGH) all of these settings! fullSettings.put("pipelineList", VisionManager.getCurrentCameraPipelineNicknames()); fullSettings.put("resolutionList", VisionManager.getCurrentCameraResolutionList()); fullSettings.put("FOV", currentCamera.getProperties().FOV);