diff --git a/Main/pom.xml b/Main/pom.xml
index b95fa0f9c..fbdbd7bb4 100644
--- a/Main/pom.xml
+++ b/Main/pom.xml
@@ -91,9 +91,14 @@
org.msgpack
- msgpack
- 0.6.12
+ msgpack-core
+ 0.8.18
+
+
+
+
+
org.springframework
spring-beans
diff --git a/Main/src/main/java/com/chameleonvision/vision/Orientation.java b/Main/src/main/java/com/chameleonvision/vision/Orientation.java
new file mode 100644
index 000000000..d5d035f9f
--- /dev/null
+++ b/Main/src/main/java/com/chameleonvision/vision/Orientation.java
@@ -0,0 +1,5 @@
+package com.chameleonvision.vision;
+
+public enum Orientation {
+ Normal,Inverted//TODO add 90 and 270 deg rotation?
+}
diff --git a/Main/src/main/java/com/chameleonvision/vision/Pipeline.java b/Main/src/main/java/com/chameleonvision/vision/Pipeline.java
index 1234d028d..84fd22b5f 100644
--- a/Main/src/main/java/com/chameleonvision/vision/Pipeline.java
+++ b/Main/src/main/java/com/chameleonvision/vision/Pipeline.java
@@ -6,20 +6,20 @@ import java.util.List;
public class Pipeline {
public int exposure = 50;
public int brightness = 50;
- public String orientation = "Normal";
+ public Orientation orientation = Orientation.Normal;
public List hue = Arrays.asList(50, 180);
public List saturation = Arrays.asList(50, 255);
public List value = Arrays.asList(50, 255);
public boolean erode = false;
public boolean dilate = false;
- public List area = Arrays.asList(0, 100);
- public List ratio = Arrays.asList(0D, 20D);
+ public List area = Arrays.asList(0f, 100f);
+ public List ratio = Arrays.asList(0f, 20f);
public List extent = Arrays.asList(0, 100);
- public int is_binary = 0;
- public String sort_mode = "Largest";
- public String target_group = "Single";
- public String target_intersection = "Up";
+ public boolean isBinary = false;
+ public SortMode sortMode = SortMode.Largest;
+ public TargetGroup targetGroup = TargetGroup.Single;
+ public TargetIntersection targetIntersection = TargetIntersection.Up;
public double M = 1;
public double B = 0;
- public boolean is_calibrated = false;
+ public boolean isCalibrated = false;
}
diff --git a/Main/src/main/java/com/chameleonvision/vision/SortMode.java b/Main/src/main/java/com/chameleonvision/vision/SortMode.java
new file mode 100644
index 000000000..e97322230
--- /dev/null
+++ b/Main/src/main/java/com/chameleonvision/vision/SortMode.java
@@ -0,0 +1,5 @@
+package com.chameleonvision.vision;
+
+public enum SortMode {
+ Largest,Smallest,Highest,Lowest,Rightmost,Leftmost,Centermost
+}
diff --git a/Main/src/main/java/com/chameleonvision/vision/TargetGroup.java b/Main/src/main/java/com/chameleonvision/vision/TargetGroup.java
new file mode 100644
index 000000000..83f5d437e
--- /dev/null
+++ b/Main/src/main/java/com/chameleonvision/vision/TargetGroup.java
@@ -0,0 +1,5 @@
+package com.chameleonvision.vision;
+
+public enum TargetGroup {
+ Single,Dual,Triple,Quadruple,Quintuple
+}
diff --git a/Main/src/main/java/com/chameleonvision/vision/TargetIntersection.java b/Main/src/main/java/com/chameleonvision/vision/TargetIntersection.java
new file mode 100644
index 000000000..34e75b2bf
--- /dev/null
+++ b/Main/src/main/java/com/chameleonvision/vision/TargetIntersection.java
@@ -0,0 +1,5 @@
+package com.chameleonvision.vision;
+
+public enum TargetIntersection {
+ None,Up,Down,Left,Right
+}
diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java
index 23038d26d..f417dfb45 100644
--- a/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java
+++ b/Main/src/main/java/com/chameleonvision/vision/camera/Camera.java
@@ -13,7 +13,7 @@ import java.util.stream.IntStream;
public class Camera {
- private static final double DEFAULT_FOV = 60.8;
+ private static final float DEFAULT_FOV = 60.8f;
private static final int MINIMUM_FPS = 30;
private static final int MINIMUM_WIDTH = 320;
private static final int MINIMUM_HEIGHT = 200;
@@ -29,7 +29,7 @@ public class Camera {
private final CvSink cvSink;
private final Object cvSourceLock = new Object();
private CvSource cvSource;
- private double FOV;
+ private float FOV;
private CameraValues camVals;
private CamVideoMode camVideoMode;
private int currentPipelineIndex;
@@ -39,23 +39,23 @@ public class Camera {
this(cameraName, DEFAULT_FOV);
}
- public Camera(String cameraName, double fov) {
+ public Camera(String cameraName, float fov) {
this(cameraName,CameraManager.AllUsbCameraInfosByName.get(cameraName), fov);
}
- public Camera(String cameraName, UsbCameraInfo usbCamInfo, double fov) {
+ public Camera(String cameraName, UsbCameraInfo usbCamInfo, float fov) {
this(cameraName ,usbCamInfo, fov, new HashMap<>(), 0);
}
- public Camera(String cameraName, double fov, int videoModeIndex) {
+ public Camera(String cameraName, float fov, int videoModeIndex) {
this(cameraName, fov, new HashMap<>(), videoModeIndex);
}
- public Camera(String cameraName, double fov, HashMap pipelines, int videoModeIndex) {
+ public Camera(String cameraName, float fov, HashMap pipelines, int videoModeIndex) {
this(cameraName, CameraManager.AllUsbCameraInfosByName.get(cameraName), fov, pipelines, videoModeIndex);
}
- public Camera(String cameraName, UsbCameraInfo usbCamInfo, double fov, HashMap pipelines, int videoModeIndex) {
+ public Camera(String cameraName, UsbCameraInfo usbCamInfo, float fov, HashMap pipelines, int videoModeIndex) {
FOV = fov;
name = cameraName;
path = usbCamInfo.path;
@@ -158,11 +158,11 @@ public class Camera {
.orElse(-1);
}
- public double getFOV() {
+ public float getFOV() {
return FOV;
}
- public void setFOV(double fov) {
+ public void setFOV(float fov) {
FOV = fov;
camVals = new CameraValues(this);
}
diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraDeserializer.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraDeserializer.java
index 18e35823f..d5326fdc7 100644
--- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraDeserializer.java
+++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraDeserializer.java
@@ -14,7 +14,7 @@ public class CameraDeserializer implements JsonDeserializer {
@Override
public Camera deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext context) throws JsonParseException {
var jsonObj = jsonElement.getAsJsonObject();
- var camFOV = jsonObj.get("FOV").getAsDouble();
+ var camFOV = jsonObj.get("FOV").getAsFloat();
var camName = jsonObj.get("name").getAsString();
var videoModeIndex = jsonObj.get("resolution").getAsInt();
diff --git a/Main/src/main/java/com/chameleonvision/vision/camera/CameraValues.java b/Main/src/main/java/com/chameleonvision/vision/camera/CameraValues.java
index 0ea7e8873..324e0348f 100644
--- a/Main/src/main/java/com/chameleonvision/vision/camera/CameraValues.java
+++ b/Main/src/main/java/com/chameleonvision/vision/camera/CameraValues.java
@@ -7,7 +7,7 @@ import org.apache.commons.math3.util.FastMath;
public class CameraValues {
public final int ImageWidth;
public final int ImageHeight;
- public final double FOV;
+ public final float FOV;
public final double ImageArea;
public final double CenterX;
public final double CenterY;
@@ -24,7 +24,7 @@ public class CameraValues {
this(camera.getVideoMode().width, camera.getVideoMode().height, camera.getFOV());
}
- public CameraValues(int imageWidth, int imageHeight, double fov) {
+ public CameraValues(int imageWidth, int imageHeight, float fov) {
ImageWidth = imageWidth;
ImageHeight = imageHeight;
FOV = fov;
diff --git a/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java
index 4ced66d97..7d0f0ce41 100644
--- a/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java
+++ b/Main/src/main/java/com/chameleonvision/vision/process/CVProcess.java
@@ -1,5 +1,8 @@
package com.chameleonvision.vision.process;
+import com.chameleonvision.vision.SortMode;
+import com.chameleonvision.vision.TargetGroup;
+import com.chameleonvision.vision.TargetIntersection;
import com.chameleonvision.vision.camera.CameraValues;
import com.chameleonvision.util.MathHandler;
import org.apache.commons.math3.util.FastMath;
@@ -14,13 +17,6 @@ import java.util.*;
public class CVProcess {
private final CameraValues cameraValues;
- private HashMap targetGrouping = new HashMap<>() {{
- put("Single", 1);
- put("Dual", 2);
- put("Triple", 3);
- put("Quadruple", 4);
- put("Quintuple", 5);
- }};
private Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(5, 5));
private Size blur = new Size(1,1);
private Mat hsvImage = new Mat();
@@ -58,7 +54,7 @@ public class CVProcess {
return foundContours;
}
- List filterContours(List inputContours, List area, List ratio, List extent) {
+ List filterContours(List inputContours, List area, List ratio, List extent) {
for (MatOfPoint Contour : inputContours) {
try {
double contourArea = Imgproc.contourArea(Contour);
@@ -97,34 +93,34 @@ public class CVProcess {
Moments m = Imgproc.moments(c);
return (m.get_m10()/m.get_m00());
}
- RotatedRect sortTargetsToOne(List inputRects, String sortMode) {
+ RotatedRect sortTargetsToOne(List inputRects, SortMode sortMode) {
switch (sortMode) {
- case "Largest":
+ case Largest:
return Collections.max(inputRects, Comparator.comparing(rect -> rect.size.area()));
- case "Smallest":
+ case Smallest:
return Collections.min(inputRects, Comparator.comparing(rect -> rect.size.area()));
- case "Highest":
+ case Highest:
return Collections.min(inputRects, Comparator.comparing(rect -> rect.center.y));
- case "Lowest":
+ case Lowest:
return Collections.max(inputRects, Comparator.comparing(rect -> rect.center.y));
- case "Leftmost":
+ case Leftmost:
return Collections.min(inputRects, Comparator.comparing(rect -> rect.center.x));
- case "Rightmost":
+ case Rightmost:
return Collections.max(inputRects, Comparator.comparing(rect -> rect.center.x));
- case "Centermost":
+ case Centermost:
return Collections.min(inputRects, sortByCentermostComparator);
default:
return inputRects.get(0); // default to whatever the first contour is, but this should never happen
}
}
- List groupTargets(List inputContours, String intersectionPoint, String targetGroup) {
+ List groupTargets(List inputContours, TargetIntersection intersectionPoint, TargetGroup targetGroup) {
finalCountours.clear();
- if (!targetGroup.equals("Single")) {
+ if (!targetGroup.equals(TargetGroup.Single)) {
inputContours.sort(sortByMomentsX);
for (var i = 0; i < inputContours.size(); i++) {
List FinalContourList = new ArrayList<>(inputContours.get(i).toList());
- for (var c = 0; c < (targetGrouping.get(targetGroup) - 1); c++) {
+ for (var c = 0; c < targetGroup.ordinal(); c++) {
try {
MatOfPoint firstContour = inputContours.get(i + c);
MatOfPoint secondContour = inputContours.get(i + c + 1);
@@ -163,8 +159,8 @@ public class CVProcess {
return finalCountours;
}
- private boolean isIntersecting(MatOfPoint ContourOne, MatOfPoint ContourTwo, String IntersectionPoint) {
- if (IntersectionPoint.equals("None")) {
+ private boolean isIntersecting(MatOfPoint ContourOne, MatOfPoint ContourTwo, TargetIntersection intersectionPoint) {
+ if (intersectionPoint.equals(TargetIntersection.None)) {
return true;
}
try {
@@ -182,26 +178,26 @@ public class CVProcess {
double intersectionY = (mA * (intersectionX - x0A)) + y0A;
double massX = (x0A + x0B) / 2;
double massY = (y0A + y0B) / 2;
- switch (IntersectionPoint) {
- case "Up": {
+ switch (intersectionPoint) {
+ case Up: {
if (intersectionY < massY) {
return true;
}
break;
}
- case "Down": {
+ case Down: {
if (intersectionY > massY) {
return true;
}
break;
}
- case "Left": {
+ case Left: {
if (intersectionX < massX) {
return true;
}
break;
}
- case "Right": {
+ case Right: {
if (intersectionX > massX) {
return true;
}
diff --git a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java
index 66c3208aa..7a5321c1a 100644
--- a/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java
+++ b/Main/src/main/java/com/chameleonvision/vision/process/VisionProcess.java
@@ -1,6 +1,7 @@
package com.chameleonvision.vision.process;
import com.chameleonvision.settings.SettingsManager;
+import com.chameleonvision.vision.Orientation;
import com.chameleonvision.vision.Pipeline;
import com.chameleonvision.vision.camera.Camera;
import com.chameleonvision.web.ServerHandler;
@@ -135,7 +136,7 @@ public class VisionProcess implements Runnable {
if (currentPipeline == null) {
return pipelineResult;
}
- if (!currentPipeline.orientation.equals("Normal")) {
+ if (currentPipeline.orientation.equals(Orientation.Inverted)) {
Core.flip(inputImage, inputImage, -1);
}
if (ntDriverModeEntry.getBoolean(false)) {
@@ -147,7 +148,7 @@ public class VisionProcess implements Runnable {
cvProcess.hsvThreshold(inputImage, hsvThreshMat, hsvLower, hsvUpper, currentPipeline.erode, currentPipeline.dilate);
- if (currentPipeline.is_binary == 1) {
+ if (currentPipeline.isBinary == true) {
Imgproc.cvtColor(hsvThreshMat, outputImage, Imgproc.COLOR_GRAY2BGR, 3);
} else {
inputImage.copyTo(outputImage);
@@ -156,13 +157,13 @@ public class VisionProcess implements Runnable {
if (foundContours.size() > 0) {
filteredContours = cvProcess.filterContours(foundContours, currentPipeline.area, currentPipeline.ratio, currentPipeline.extent);
if (filteredContours.size() > 0) {
- groupedContours = cvProcess.groupTargets(filteredContours, currentPipeline.target_intersection, currentPipeline.target_group);
+ groupedContours = cvProcess.groupTargets(filteredContours, currentPipeline.targetIntersection, currentPipeline.targetGroup);
if (groupedContours.size() > 0) {
- var finalRect = cvProcess.sortTargetsToOne(groupedContours, currentPipeline.sort_mode);
+ var finalRect = cvProcess.sortTargetsToOne(groupedContours, currentPipeline.sortMode);
// System.out.printf("Largest Contour Area: %.2f\n", finalRect.size.area());
pipelineResult.RawPoint = finalRect;
pipelineResult.IsValid = true;
- if (!currentPipeline.is_calibrated) {
+ if (!currentPipeline.isCalibrated) {
pipelineResult.CalibratedX = camera.getCamVals().CenterX;
pipelineResult.CalibratedY = camera.getCamVals().CenterY;
} else {
diff --git a/Main/src/main/java/com/chameleonvision/web/Server.java b/Main/src/main/java/com/chameleonvision/web/Server.java
index b8ae75d50..a3ee30ce4 100644
--- a/Main/src/main/java/com/chameleonvision/web/Server.java
+++ b/Main/src/main/java/com/chameleonvision/web/Server.java
@@ -22,11 +22,10 @@ public class Server {
System.out.println("Socket Disconnected");
SettingsManager.saveSettings();
});
- ws.onMessage(ctx -> {
-// handler.onMessage(ctx);
+ ws.onBinaryMessage(ctx -> {
+ handler.onBinaryMessage(ctx);
});
- ws.onBinaryMessage(ctx->handler.onMessage(ctx));
+ app.start(port);
});
- app.start(port);
}
-}
+}
\ No newline at end of file
diff --git a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java
index 3c9456c39..550681f06 100644
--- a/Main/src/main/java/com/chameleonvision/web/ServerHandler.java
+++ b/Main/src/main/java/com/chameleonvision/web/ServerHandler.java
@@ -1,33 +1,33 @@
package com.chameleonvision.web;
+import com.chameleonvision.vision.Orientation;
+import com.chameleonvision.vision.SortMode;
+import com.chameleonvision.vision.TargetGroup;
+import com.chameleonvision.vision.TargetIntersection;
import com.chameleonvision.vision.camera.CameraException;
import com.chameleonvision.settings.SettingsManager;
import com.chameleonvision.vision.camera.CameraManager;
import edu.wpi.cscore.VideoException;
import io.javalin.websocket.*;
import org.apache.commons.lang3.ArrayUtils;
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.msgpack.MessagePack;
-import org.msgpack.template.Templates;
-import org.msgpack.type.ArrayValue;
-import org.msgpack.type.BooleanValue;
-import org.msgpack.type.IntegerValue;
-import org.msgpack.type.MapValue;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.msgpack.core.MessagePack;
+import org.msgpack.core.MessageUnpacker;
+import org.msgpack.value.ImmutableArrayValue;
+import org.msgpack.value.ImmutableValue;
+import org.msgpack.value.Value;
import org.springframework.beans.BeanUtils;
-
-import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
+
public class ServerHandler {
private static List users;
- private MessagePack msgpack;
ServerHandler() {
users = new ArrayList<>();
- msgpack = new MessagePack();
}
void onConnect(WsConnectContext context) {
@@ -39,103 +39,97 @@ public class ServerHandler {
users.remove(context);
}
- void onMessage(WsBinaryMessageContext data) throws IOException {
- byte[] b = ArrayUtils.toPrimitive(data.data());
- System.out.println(msgpack.read(b).isMapValue());
- Map entries = msgpack.read(b,Templates.tMap(Templates.TString,Templates.TValue));
- System.out.println(Arrays.toString(entries.entrySet().toArray()));
- entries.forEach((k, value) -> {
- /*
- To get int from value
- ((IntegerValue)value).getInt();
-
- To get boolean from value
- ((BooleanValue)value).getBoolean();
-
- To get Array from value
- ((ArrayValue) value).toArray();
-
- */
- String key = k.toString();
- System.out.printf("Got websocket msgpack data: [%s, %s]\n", key, value);
-
-
- try{
- if (hasField(CameraManager.getCurrentPipeline(), key)) {
- //Special cases for exposure and brightness and aspect ratio
- switch (key) {
- case "exposure":
- int newExposure = ((IntegerValue)value).getInt();
- System.out.printf("Changing exposure to %d\n", newExposure);
- try {
- CameraManager.getCurrentCamera().setExposure(newExposure);
- } catch (VideoException e) {
- System.out.println("Exposure changes is not supported on your webcam/webcam's driver");
- }
- break;
- case "brightness":
- int newBrightness = (int) value;
- System.out.printf("Changing brightness to %d\n", newBrightness);
- CameraManager.getCurrentCamera().setBrightness(newBrightness);
- break;
- case "ratio":
- //If there is any better to convert Integer to Double you're welcome to change it
- List doubleRatio = CameraManager.getCurrentPipeline().ratio;
- List