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 595d49905..c99e5af0b 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java @@ -57,7 +57,7 @@ public class VisionProcess { pipelineManager = new PipelineManager(this, loadedPipelineSettings); // Thread to put frames on the dashboard - this.cameraStreamer = new CameraStreamer(cameraCapture, name); + this.cameraStreamer = new CameraStreamer(cameraCapture, name,pipelineManager.getCurrentPipeline().settings.streamDivisor); this.streamRunnable = new CameraStreamerRunnable(30, cameraStreamer); // Thread to process vision data diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CameraStreamer.java b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CameraStreamer.java index b36a0ad60..b3c9a95bf 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CameraStreamer.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CameraStreamer.java @@ -14,13 +14,14 @@ import org.opencv.imgproc.Imgproc; public class CameraStreamer { private final CameraCapture cameraCapture; private final String name; - private StreamDivisor divisor = StreamDivisor.NONE; + private StreamDivisor divisor; private CvSource cvSource; private final Object streamBufferLock = new Object(); private Mat streamBuffer = new Mat(); private Size size; - public CameraStreamer(CameraCapture cameraCapture, String name) { + public CameraStreamer(CameraCapture cameraCapture, String name,StreamDivisor div) { + this.divisor = div; this.cameraCapture = cameraCapture; this.name = name; this.cvSource = CameraServer.getInstance().putVideo(name, @@ -35,28 +36,33 @@ public class CameraStreamer { } public void setDivisor(StreamDivisor newDivisor, boolean updateUI) { - if (divisor != newDivisor) { - this.divisor = newDivisor; - var camValues = cameraCapture.getProperties(); - var newWidth = camValues.getStaticProperties().imageWidth / newDivisor.value; - var newHeight = camValues.getStaticProperties().imageHeight / newDivisor.value; - this.size = new Size(newWidth, newHeight); - synchronized (streamBufferLock) { - this.streamBuffer = new Mat(newWidth, newHeight, CvType.CV_8UC3); - this.cvSource = CameraServer.getInstance().putVideo(this.name, - cameraCapture.getProperties().getStaticProperties().imageWidth / divisor.value, - cameraCapture.getProperties().getStaticProperties().imageHeight / divisor.value); - } - if (updateUI) { - SocketHandler.sendFullSettings(); - } + this.divisor = newDivisor; + var camValues = cameraCapture.getProperties(); + var newWidth = camValues.getStaticProperties().imageWidth / newDivisor.value; + var newHeight = camValues.getStaticProperties().imageHeight / newDivisor.value; + this.size = new Size(newWidth, newHeight); + synchronized (streamBufferLock) { + this.streamBuffer = new Mat(newWidth, newHeight, CvType.CV_8UC3); + VideoMode oldVideoMode = cvSource.getVideoMode(); + cvSource.setVideoMode(new VideoMode(oldVideoMode.pixelFormat, + cameraCapture.getProperties().getStaticProperties().imageWidth / divisor.value, + cameraCapture.getProperties().getStaticProperties().imageHeight / divisor.value, + oldVideoMode.fps)); } + if (updateUI) { + SocketHandler.sendFullSettings(); + } + } public StreamDivisor getDivisor() { return divisor; } + public void recalculateDivision() { + setDivisor(this.divisor, false); + } + public void setNewVideoMode(VideoMode newVideoMode) { // Trick to update cvSource and streamBuffer to the new resolution // Must change the cameraProcess resolution first 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 8bc5602e5..2f1843c2c 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 @@ -137,6 +137,8 @@ public class PipelineManager { } } newPipeline.initPipeline(parentProcess.getCamera()); + if(parentProcess.cameraStreamer!=null) + parentProcess.cameraStreamer.setDivisor(newPipeline.settings.streamDivisor,true); if(ntIndexEntry != null) { ntIndexEntry.setDouble(index); } 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 b5e91fbe3..4f4517494 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java @@ -180,6 +180,7 @@ public class SocketHandler { if (currentPipeline instanceof CVPipeline2d) ((CVPipeline2d) currentPipeline).settings.point = new ArrayList<>();//This will reset the calibration currentCamera.setVideoMode((Integer) entry.getValue()); + currentProcess.cameraStreamer.recalculateDivision(); break; } case "streamDivisor": {