Further abstract image capture, fix some UI bugs

This commit is contained in:
Banks Troutman
2019-11-25 05:34:04 -05:00
parent 26e0bb733b
commit ddba967793
23 changed files with 165 additions and 130 deletions

View File

@@ -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;

View File

@@ -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());
}

View File

@@ -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) {

View File

@@ -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<CVPipelineSettings> 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);

View File

@@ -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<CVPipeline> 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<String, Object> WebSend = new HashMap<>();
HashMap<String, Object> point = new HashMap<>();
HashMap<String, Object> 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) {

View File

@@ -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<Mat, Long> getFrame();
/**
* Set the exposure of the camera
* @param exposure the new exposure to set the camera to

View File

@@ -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();

View File

@@ -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;

View File

@@ -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);

View File

@@ -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<VideoMode> kMinSizePredicate = (videoMode -> videoMode.width >= MINIMUM_WIDTH && videoMode.height >= MINIMUM_HEIGHT);
private static final Predicate<VideoMode> kPixelFormatPredicate = (videoMode -> ALLOWED_PIXEL_FORMATS.contains(videoMode.pixelFormat));
public CameraStaticProperties staticProperties;
public final String name;
public final String path;
public final List<VideoMode> 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<VideoMode> getVideoModes() {

View File

@@ -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;
}
}

View File

@@ -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<Mat, Long> getFrame();
}

View File

@@ -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<Mat, Long> getFrame() {
return Pair.of(image, System.nanoTime());
}
}

View File

@@ -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<R extends CVPipelineResult, S extends CVPipelineSettings> {
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<R extends CVPipelineResult, S extends CVPipelin
settings.nickname = pipelineName;
}
public void initPipeline(CameraProcess camera) {
cameraProcess = camera;
cameraProcess.setExposure((int) settings.exposure);
cameraProcess.setBrightness((int) settings.brightness);
public void initPipeline(CameraCapture camera) {
cameraCapture = camera;
cameraCapture.setExposure((int) settings.exposure);
cameraCapture.setBrightness((int) settings.brightness);
}
abstract public R runPipeline(Mat inputMat);
}

View File

@@ -1,7 +1,7 @@
package com.chameleonvision.vision.pipeline;
import com.chameleonvision.vision.camera.CameraProcess;
import com.chameleonvision.vision.camera.CameraStaticProperties;
import com.chameleonvision.vision.camera.CameraCapture;
import com.chameleonvision.vision.camera.CaptureStaticProperties;
import com.chameleonvision.vision.pipeline.pipes.*;
import com.chameleonvision.vision.enums.ImageRotation;
import org.apache.commons.lang3.tuple.Pair;
@@ -41,10 +41,10 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
}
@Override
public void initPipeline(CameraProcess process) {
public void initPipeline(CameraCapture process) {
super.initPipeline(process);
CameraStaticProperties camProps = cameraProcess.getProperties().staticProperties;
CaptureStaticProperties camProps = cameraCapture.getProperties().getStaticProperties();
Scalar hsvLower = new Scalar(settings.hue.get(0).intValue(), settings.saturation.get(0).intValue(), settings.value.get(0).intValue());
Scalar hsvUpper = new Scalar(settings.hue.get(1).intValue(), settings.saturation.get(1).intValue(), settings.value.get(1).intValue());
@@ -66,7 +66,7 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
long totalProcessTimeNanos = 0;
long processStartTimeNanos = System.nanoTime();
if (cameraProcess == null) {
if (cameraCapture == null) {
throw new RuntimeException("Pipeline was not initialized before being run!");
}
if(inputMat.cols() <= 1) {
@@ -75,7 +75,7 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
StringBuilder procTimeStringBuilder = new StringBuilder();
CameraStaticProperties camProps = cameraProcess.getProperties().staticProperties;
CaptureStaticProperties camProps = cameraCapture.getProperties().getStaticProperties();
inputMat.copyTo(rawCameraMat);
@@ -84,7 +84,7 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
Scalar hsvUpper = new Scalar(settings.hue.get(1).intValue(), settings.saturation.get(1).intValue(), settings.value.get(1).intValue());
rotateFlipPipe.setConfig(ImageRotation.DEG_0, settings.flipMode);
blurPipe.setConfig(5);
blurPipe.setConfig(0);
erodeDilatePipe.setConfig(settings.erode, settings.dilate, 7);
hsvPipe.setConfig(hsvLower, hsvUpper);
filterContoursPipe.setConfig(settings.area, settings.ratio, settings.extent, camProps);

View File

@@ -19,7 +19,7 @@ public class DriverVisionPipeline extends CVPipeline<DriverPipelineResult, CVPip
outputMat = inputMat;
var camProps = cameraProcess.getProperties().staticProperties;
var camProps = cameraCapture.getProperties().getStaticProperties();
Draw2dContoursPipe.Draw2dContoursSettings draw2dContoursSettings = new Draw2dContoursPipe.Draw2dContoursSettings();
draw2dContoursSettings.showCrosshair = true;

View File

@@ -25,21 +25,22 @@ public class BlurPipe implements Pipe<Mat, Mat> {
public Pair<Mat, Long> 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<Mat, Long> output = Pair.of(outputMat, processTime);
processBuffer.release();
return output;
}
}

View File

@@ -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<RotatedRect>, List<CVPipeline2d.Target2d>> {
private CalibrationMode calibrationMode;
private CameraStaticProperties camProps;
private CaptureStaticProperties camProps;
private List<Number> calibrationPoint;
private double calibrationM, calibrationB;
private List<CVPipeline2d.Target2d> targets = new ArrayList<>();
public Collect2dTargetsPipe(CalibrationMode calibrationMode, List<Number> 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<RotatedRect>, List<CVPipe
}
public void setConfig(CalibrationMode calibrationMode, List<Number> calibrationPoint,
double calibrationM, double calibrationB, CameraStaticProperties camProps) {
double calibrationM, double calibrationB, CaptureStaticProperties camProps) {
this.calibrationMode = calibrationMode;
this.camProps = camProps;
this.calibrationPoint = calibrationPoint;

View File

@@ -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<Pair<Mat, List<RotatedRect>>, 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;
}

View File

@@ -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<MatOfPoint>, List<MatOfPoin
private List<Number> area;
private List<Number> ratio;
private List<Number> extent;
private CameraStaticProperties camProps;
private CaptureStaticProperties camProps;
private List<MatOfPoint> filteredContours = new ArrayList<>();
public FilterContoursPipe(List<Number> area, List<Number> ratio, List<Number> extent, CameraStaticProperties camProps) {
public FilterContoursPipe(List<Number> area, List<Number> ratio, List<Number> extent, CaptureStaticProperties camProps) {
this.area = area;
this.ratio = ratio;
this.extent = extent;
this.camProps = camProps;
}
public void setConfig(List<Number> area, List<Number> ratio, List<Number> extent, CameraStaticProperties camProps) {
public void setConfig(List<Number> area, List<Number> ratio, List<Number> extent, CaptureStaticProperties camProps) {
this.area = area;
this.ratio = ratio;
this.extent = extent;

View File

@@ -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<RotatedRect>, List<RotatedRec
private SortMode sort;
private CameraStaticProperties camProps;
private CaptureStaticProperties camProps;
private List<RotatedRect> 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;
}

View File

@@ -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<String, Object> deserialized = objectMapper.readValue(ArrayUtils.toPrimitive(context.data()), new TypeReference<Map<String, Object>>() {
Map<String, Object> deserialized = objectMapper.readValue(ArrayUtils.toPrimitive(context.data()), new TypeReference<>() {
});
for (Map.Entry<String, Object> entry : deserialized.entrySet()) {
try {
var data = (HashMap<String, Object>) entry.getValue();
VisionProcess currentProcess = VisionManager.getCurrentUIVisionProcess();
CameraProcess currentCamera = currentProcess.getCamera();
CameraCapture currentCamera = currentProcess.getCamera();
CVPipeline currentPipeline = currentProcess.getCurrentPipeline();
switch (entry.getKey()) {
case "generalSettings": {
HashMap<String, Object> data = (HashMap<String, Object>) entry.getValue();
for (HashMap.Entry<String, Object> e : data.entrySet()) {
setField(ConfigManager.settings, e.getKey(), e.getValue());
}
@@ -62,6 +63,7 @@ public class ServerHandler {
break;
}
case "driverMode": {
HashMap<String, Object> data = (HashMap<String, Object>) 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<String, Object> getOrdinalCameraSettings() {
HashMap<String, Object> 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<String, Object> 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);