From 58c1924c7ee9f290457439f73d0e31332c384e5a Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 16 Nov 2019 11:10:55 -0800 Subject: [PATCH] Add video mode change support to VisionProcess --- .../classabstraction/VisionProcess.java | 11 +++++++++-- .../classabstraction/camera/CameraProcess.java | 7 +++++++ .../classabstraction/camera/CameraStreamer.java | 7 +++++++ .../classabstraction/camera/USBCameraProcess.java | 12 +++++++++++- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Main/src/main/java/com/chameleonvision/classabstraction/VisionProcess.java b/Main/src/main/java/com/chameleonvision/classabstraction/VisionProcess.java index 3bbb3e29d..9390e9282 100644 --- a/Main/src/main/java/com/chameleonvision/classabstraction/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/classabstraction/VisionProcess.java @@ -6,6 +6,7 @@ import com.chameleonvision.classabstraction.pipeline.CVPipeline; import com.chameleonvision.classabstraction.pipeline.CVPipelineResult; import com.chameleonvision.classabstraction.pipeline.CVPipelineSettings; import com.chameleonvision.classabstraction.pipeline.DriverVisionPipeline; +import edu.wpi.cscore.VideoMode; import org.opencv.core.Mat; import java.util.ArrayList; @@ -18,6 +19,7 @@ public class VisionProcess { private final CameraFrameRunnable cameraRunnable; private final CameraStramerRunnable streamRunnable; private final VisionProcessRunnable visionRunnable; + private final CameraStreamer cameraStreamer; private CVPipeline currentPipeline; private final CVPipelineSettings driverVisionSettings = new CVPipelineSettings(); @@ -33,7 +35,8 @@ public class VisionProcess { new Thread(cameraRunnable).start(); // Thread to put frames on the dashboard - this.streamRunnable = new CameraStramerRunnable(streamTimeMs, new CameraStreamer(cameraProcess, name)); + this.cameraStreamer = new CameraStreamer(cameraProcess, name); + this.streamRunnable = new CameraStramerRunnable(streamTimeMs, cameraStreamer); new Thread(streamRunnable).start(); // Thread to process vision data @@ -42,7 +45,6 @@ public class VisionProcess { } - public void setPipeline(int pipelineIndex) { CVPipeline newPipeline = pipelines.get(pipelineIndex); if (newPipeline != null) { @@ -55,6 +57,11 @@ public class VisionProcess { currentPipeline.initPipeline(cameraProcess); } + public void setVideoMode(VideoMode newMode) { + cameraProcess.setVideoMode(newMode); + cameraStreamer.setNewVideoMode(newMode); + } + public CVPipeline getCurrentPipeline() { return currentPipeline; } diff --git a/Main/src/main/java/com/chameleonvision/classabstraction/camera/CameraProcess.java b/Main/src/main/java/com/chameleonvision/classabstraction/camera/CameraProcess.java index f37aa7f37..81dd80f02 100644 --- a/Main/src/main/java/com/chameleonvision/classabstraction/camera/CameraProcess.java +++ b/Main/src/main/java/com/chameleonvision/classabstraction/camera/CameraProcess.java @@ -1,5 +1,6 @@ package com.chameleonvision.classabstraction.camera; +import edu.wpi.cscore.VideoMode; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Mat; @@ -23,4 +24,10 @@ public interface CameraProcess { * @param brightness the new brightness to set the camera to */ void setBrightness(int brightness); + + /** + * Set the video mode (fps and resolution) of the camera + * @param mode the wanted mode + */ + void setVideoMode(VideoMode mode); } diff --git a/Main/src/main/java/com/chameleonvision/classabstraction/camera/CameraStreamer.java b/Main/src/main/java/com/chameleonvision/classabstraction/camera/CameraStreamer.java index 11b053d51..d464cf118 100644 --- a/Main/src/main/java/com/chameleonvision/classabstraction/camera/CameraStreamer.java +++ b/Main/src/main/java/com/chameleonvision/classabstraction/camera/CameraStreamer.java @@ -3,6 +3,7 @@ package com.chameleonvision.classabstraction.camera; import com.chameleonvision.vision.camera.StreamDivisor; import com.chameleonvision.web.ServerHandler; import edu.wpi.cscore.CvSource; +import edu.wpi.cscore.VideoMode; import edu.wpi.first.cameraserver.CameraServer; import org.opencv.core.CvType; import org.opencv.core.Mat; @@ -39,6 +40,12 @@ public class CameraStreamer { ServerHandler.sendFullSettings(); } + public void setNewVideoMode(VideoMode newVideoMode) { + // Trick to update cvSource and streamBuffer to the new resolution + // Must change the cameraProcess resolution first + setDivisor(divisor); + } + public void runStream(Mat image) { image.copyTo(streamBuffer); if (divisor.value != 1) { diff --git a/Main/src/main/java/com/chameleonvision/classabstraction/camera/USBCameraProcess.java b/Main/src/main/java/com/chameleonvision/classabstraction/camera/USBCameraProcess.java index 1afadb6c1..71a0f00a2 100644 --- a/Main/src/main/java/com/chameleonvision/classabstraction/camera/USBCameraProcess.java +++ b/Main/src/main/java/com/chameleonvision/classabstraction/camera/USBCameraProcess.java @@ -13,7 +13,7 @@ public class USBCameraProcess implements CameraProcess { private final UsbCamera baseCamera; private final CvSink cvSink; private Mat imageBuffer = new Mat(); - public final CameraProperties properties; + public CameraProperties properties; public USBCameraProcess(UsbCamera camera, CameraConfig config) { baseCamera = camera; @@ -53,4 +53,14 @@ public class USBCameraProcess implements CameraProcess { System.err.println("Current camera does not support brightness change"); } } + + @Override + public void setVideoMode(VideoMode mode) { + try { + baseCamera.setVideoMode(mode); + properties = new CameraProperties(baseCamera, properties.FOV); + } catch (VideoException e) { + System.err.println("Current camera does not support resolution change"); + } + } }