diff --git a/chameleon-server/src/main/java/com/chameleonvision/config/CameraJsonConfig.java b/chameleon-server/src/main/java/com/chameleonvision/config/CameraJsonConfig.java index 6ec03e132..69ae4651e 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/config/CameraJsonConfig.java +++ b/chameleon-server/src/main/java/com/chameleonvision/config/CameraJsonConfig.java @@ -1,7 +1,7 @@ package com.chameleonvision.config; import com.chameleonvision.vision.VisionProcess; -import com.chameleonvision.vision.camera.USBCameraProperties; +import com.chameleonvision.vision.camera.USBCaptureProperties; import com.chameleonvision.vision.enums.StreamDivisor; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -31,7 +31,7 @@ public class CameraJsonConfig { } public CameraJsonConfig(String path, String name) { - this.fov = USBCameraProperties.DEFAULT_FOV; + this.fov = USBCaptureProperties.DEFAULT_FOV; this.path = path; this.name = name; this.nickname = name; @@ -40,7 +40,7 @@ public class CameraJsonConfig { } public static CameraJsonConfig fromVisionProcess(VisionProcess process) { - USBCameraProperties camProps = process.getCamera().getProperties(); + USBCaptureProperties camProps = process.getCamera().getProperties(); int videomode = camProps.getCurrentVideoModeIndex(); StreamDivisor streamDivisor = process.cameraStreamer.getDivisor(); return new CameraJsonConfig(camProps.getFOV(), camProps.path, camProps.name, camProps.getNickname(), videomode, streamDivisor); diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/VisionManager.java b/chameleon-server/src/main/java/com/chameleonvision/vision/VisionManager.java index e7ad66c0f..11352b9a0 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/VisionManager.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/VisionManager.java @@ -84,7 +84,7 @@ public class VisionManager { CameraJsonConfig cameraJsonConfig = config.cameraConfig; - CameraCapture camera = new USBCameraCapture(cameraJsonConfig); + USBCameraCapture camera = new USBCameraCapture(cameraJsonConfig); VisionProcess process = new VisionProcess(camera, cameraJsonConfig.name, config.pipelines); process.pipelineManager.driverModePipeline.settings = config.drivermode; visionProcesses.add(new VisionProcessManageable(i, cameraJsonConfig.name, process)); @@ -165,7 +165,7 @@ public class VisionManager { currentUIVisionProcess.pipelineManager.saveDriverModeConfig(); } - private static List getCameraResolutionList(CameraCapture capture) { + private static List getCameraResolutionList(USBCameraCapture capture) { return capture.getProperties().getVideoModes().stream().map(Helpers::VideoModeToHashMap).collect(Collectors.toList()); } 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 cfe953cb5..43938b274 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/VisionProcess.java @@ -5,6 +5,7 @@ import com.chameleonvision.config.ConfigManager; import com.chameleonvision.util.LoopingRunnable; import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.vision.camera.CameraStreamer; +import com.chameleonvision.vision.camera.USBCameraCapture; import com.chameleonvision.vision.pipeline.*; import com.chameleonvision.web.SocketHandler; import com.fasterxml.jackson.core.JsonProcessingException; @@ -24,7 +25,7 @@ import java.util.concurrent.LinkedBlockingDeque; public class VisionProcess { - private final CameraCapture cameraCapture; + private final USBCameraCapture cameraCapture; private final CameraStreamerRunnable streamRunnable; private final VisionProcessRunnable visionRunnable; public final CameraStreamer cameraStreamer; @@ -48,7 +49,7 @@ public class VisionProcess { private NetworkTableEntry ntValidEntry; private ObjectMapper objectMapper = new ObjectMapper(); - VisionProcess(CameraCapture cameraCapture, String name, List loadedPipelineSettings) { + VisionProcess(USBCameraCapture cameraCapture, String name, List loadedPipelineSettings) { this.cameraCapture = cameraCapture; pipelineManager = new PipelineManager(this, loadedPipelineSettings); @@ -218,7 +219,7 @@ public class VisionProcess { return cameraCapture.getProperties().videoModes; } - public CameraCapture getCamera() { + public USBCameraCapture getCamera() { return cameraCapture; } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CameraCapture.java b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CameraCapture.java index d9815ae5f..949e0da77 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CameraCapture.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CameraCapture.java @@ -1,10 +1,11 @@ package com.chameleonvision.vision.camera; +import com.chameleonvision.vision.image.CaptureProperties; import com.chameleonvision.vision.image.ImageCapture; import edu.wpi.cscore.VideoMode; public interface CameraCapture extends ImageCapture { - USBCameraProperties getProperties(); + CaptureProperties getProperties(); VideoMode getCurrentVideoMode(); diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CaptureStaticProperties.java b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CaptureStaticProperties.java index 1837341dc..73fc30760 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CaptureStaticProperties.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/CaptureStaticProperties.java @@ -16,10 +16,10 @@ public class CaptureStaticProperties { public final double verticalFocalLength; public final VideoMode mode; - public CaptureStaticProperties(VideoMode mode, int imageWidth, int imageHeight, double fov) { + public CaptureStaticProperties(VideoMode mode, double fov) { this.mode = mode; - this.imageWidth = imageWidth; - this.imageHeight = imageHeight; + this.imageWidth = mode.width; + this.imageHeight = mode.height; this.fov = fov; imageArea = this.imageWidth * this.imageHeight; centerX = ((double) this.imageWidth / 2) - 0.5; diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCameraCapture.java b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCameraCapture.java index 7113fbf4f..0cba6a2dd 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCameraCapture.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCameraCapture.java @@ -1,6 +1,7 @@ package com.chameleonvision.vision.camera; import com.chameleonvision.config.CameraJsonConfig; +import com.chameleonvision.vision.image.CaptureProperties; import edu.wpi.cscore.CvSink; import edu.wpi.cscore.UsbCamera; import edu.wpi.cscore.VideoException; @@ -13,19 +14,20 @@ public class USBCameraCapture implements CameraCapture { private final UsbCamera baseCamera; private final CvSink cvSink; private Mat imageBuffer = new Mat(); - private USBCameraProperties properties; + private USBCaptureProperties properties; public USBCameraCapture(CameraJsonConfig config) { baseCamera = new UsbCamera(config.name, config.path); cvSink = CameraServer.getInstance().getVideo(baseCamera); - properties = new USBCameraProperties(baseCamera, config); + properties = new USBCaptureProperties(baseCamera, config); int videoMode = properties.videoModes.size() - 1 <= config.videomode ? config.videomode : 0; setVideoMode(videoMode); } + @Override - public USBCameraProperties getProperties() { + public USBCaptureProperties getProperties() { return properties; } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCameraProperties.java b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCaptureProperties.java similarity index 93% rename from chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCameraProperties.java rename to chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCaptureProperties.java index 6f20dbd6e..b08d6701b 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCameraProperties.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/camera/USBCaptureProperties.java @@ -12,7 +12,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -public class USBCameraProperties extends CaptureProperties { +public class USBCaptureProperties extends com.chameleonvision.vision.image.CaptureProperties { public static final double DEFAULT_FOV = 70; private static final int DEFAULT_EXPOSURE = 50; private static final int DEFAULT_BRIGHTNESS = 50; @@ -40,7 +40,7 @@ public class USBCameraProperties extends CaptureProperties { private String nickname; private double FOV; - USBCameraProperties(UsbCamera baseCamera, CameraJsonConfig config) { + USBCaptureProperties(UsbCamera baseCamera, CameraJsonConfig config) { FOV = config.fov; name = config.name; path = config.path; @@ -70,7 +70,7 @@ public class USBCameraProperties extends CaptureProperties { public void setFOV(double FOV) { if (this.FOV != FOV) { this.FOV = FOV; - staticProperties = new CaptureStaticProperties(staticProperties.mode, staticProperties.imageWidth, staticProperties.imageHeight, FOV); + staticProperties = new CaptureStaticProperties(staticProperties.mode, FOV); } } @@ -93,7 +93,7 @@ public class USBCameraProperties extends CaptureProperties { } void updateVideoMode(VideoMode videoMode) { - staticProperties = new CaptureStaticProperties(videoMode, videoMode.width, videoMode.height, FOV); + staticProperties = new CaptureStaticProperties(videoMode, FOV); } public List getVideoModes() { diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java b/chameleon-server/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java index e1f82fe98..8717bb88d 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/image/CaptureProperties.java @@ -11,8 +11,8 @@ public class CaptureProperties { protected CaptureProperties() { } - public CaptureProperties(Mat staticImage, double fov) { - staticProperties = new CaptureStaticProperties(new VideoMode(0, staticImage.cols(), staticImage.rows(), 99999), staticImage.cols(), staticImage.rows(), fov); + public CaptureProperties(VideoMode videoMode, double fov) { + staticProperties = new CaptureStaticProperties(videoMode, fov); } public CaptureStaticProperties getStaticProperties() { diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/image/StaticImageCapture.java b/chameleon-server/src/main/java/com/chameleonvision/vision/image/StaticImageCapture.java index 3f738f118..5de9999b7 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/image/StaticImageCapture.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/image/StaticImageCapture.java @@ -1,5 +1,8 @@ package com.chameleonvision.vision.image; +import com.chameleonvision.vision.camera.CameraCapture; +import com.chameleonvision.vision.camera.USBCaptureProperties; +import edu.wpi.cscore.VideoMode; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Mat; import org.opencv.imgcodecs.Imgcodecs; @@ -7,26 +10,67 @@ import org.opencv.imgcodecs.Imgcodecs; import java.nio.file.Files; import java.nio.file.Path; -public class StaticImageCapture implements ImageCapture { +public class StaticImageCapture implements CameraCapture { - private final Mat image = new Mat(); + private Mat image = new Mat(); + private final VideoMode fakeVideoMode; + private final com.chameleonvision.vision.image.CaptureProperties properties; public StaticImageCapture(Path imagePath) { + this(imagePath, 70); + } + + public StaticImageCapture(Path imagePath, double FOV) { 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); + Mat loadedImage = Imgcodecs.imread(imagePath.toString()); + loadedImage.copyTo(image); + if (image.cols() > 0 && image.rows() > 0) { + fakeVideoMode = new VideoMode(VideoMode.PixelFormat.kBGR, image.cols(), image.rows(), 60); + } else { + throw new RuntimeException("Failed to load image!"); } + + properties = new com.chameleonvision.vision.image.CaptureProperties(fakeVideoMode, FOV); } @Override public Pair getFrame() { return Pair.of(image, System.nanoTime()); } + + @Override + public CaptureProperties getProperties() { + return properties; + } + + @Override + public VideoMode getCurrentVideoMode() { + return fakeVideoMode; + } + + @Override + public void setExposure(int exposure) { + // do nothing + } + + @Override + public void setBrightness(int brightness) { + // do nothing + } + + @Override + public void setVideoMode(VideoMode mode) { + // do nothing + } + + @Override + public void setVideoMode(int index) { + // do nothing + } + + @Override + public void setGain(int gain) { + // do nothing + } } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java index f93d9643e..c3f113b04 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java @@ -1,6 +1,7 @@ package com.chameleonvision.vision.pipeline; import com.chameleonvision.Main; +import com.chameleonvision.util.MemoryManager; import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.vision.pipeline.pipes.*; @@ -78,6 +79,8 @@ public class CVPipeline2d extends CVPipeline { public final List targets; public final boolean hasTarget; - public final Mat outputMat = new Mat(); + public final Mat outputMat; public final long processTime; public long imageTimestamp = 0; public CVPipelineResult(List targets, Mat outputMat, long processTime) { this.targets = targets; hasTarget = targets != null && !targets.isEmpty(); - outputMat.copyTo(this.outputMat); + this.outputMat = outputMat; +// outputMat.copyTo(this.outputMat); +// outputMat.release(); this.processTime = processTime; } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/DriverVisionPipeline.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/DriverVisionPipeline.java index 2eafad400..3f6d56a61 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/DriverVisionPipeline.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/DriverVisionPipeline.java @@ -1,7 +1,10 @@ package com.chameleonvision.vision.pipeline; +import com.chameleonvision.Main; +import com.chameleonvision.util.MemoryManager; import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.vision.pipeline.pipes.Draw2dContoursPipe; +import com.chameleonvision.vision.pipeline.pipes.RotateFlipPipe; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Mat; import org.opencv.core.RotatedRect; @@ -12,10 +15,13 @@ import static com.chameleonvision.vision.pipeline.DriverVisionPipeline.DriverPip public class DriverVisionPipeline extends CVPipeline { + private RotateFlipPipe rotateFlipPipe; private Draw2dContoursPipe draw2dContoursPipe; private Draw2dContoursPipe.Draw2dContoursSettings draw2dContoursSettings = new Draw2dContoursPipe.Draw2dContoursSettings(); private final List blankList = List.of(); + private final MemoryManager memoryManager = new MemoryManager(50); + public DriverVisionPipeline(CVPipelineSettings settings) { super(settings); settings.index = -1; @@ -24,6 +30,7 @@ public class DriverVisionPipeline extends CVPipeline rotateFlipResult = rotateFlipPipe.run(inputMat); + Pair draw2dContoursResult = draw2dContoursPipe.run(Pair.of(rotateFlipResult.getLeft(), blankList)); + + memoryManager.run(Main.testMode); + + return new DriverPipelineResult(null, draw2dContoursResult.getLeft(), 0); } public static class DriverPipelineResult extends CVPipelineResult { diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java index 4c7606949..af2a1489a 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java @@ -40,7 +40,8 @@ public class Draw2dContoursPipe implements Pipe>, Ma long processStartNanos = System.nanoTime(); if (settings.showCrosshair || settings.showCentroid || settings.showMaximumBox || settings.showRotatedBox) { - input.getLeft().copyTo(processBuffer); +// input.getLeft().copyTo(processBuffer); + processBuffer = input.getLeft(); if (input.getRight().size() > 0) { for (int i = 0; i < input.getRight().size(); i++) { @@ -81,14 +82,14 @@ public class Draw2dContoursPipe implements Pipe>, Ma Imgproc.line(processBuffer, yMax, yMin, Helpers.colorToScalar(settings.crosshairColor), 2); } - processBuffer.copyTo(outputMat); - processBuffer.release(); +// processBuffer.copyTo(outputMat); +// processBuffer.release(); } else { - input.getLeft().copyTo(outputMat); +// input.getLeft().copyTo(outputMat); } long processTime = System.nanoTime() - processStartNanos; - return Pair.of(outputMat, processTime); + return Pair.of(processBuffer, processTime); } public static class Draw2dContoursSettings { diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/RotateFlipPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/RotateFlipPipe.java index 4ae451b84..bbb2773e3 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/RotateFlipPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/RotateFlipPipe.java @@ -32,23 +32,23 @@ public class RotateFlipPipe implements Pipe { boolean shouldRotate = !rotation.equals(ImageRotationMode.DEG_0); if (shouldFlip || shouldRotate) { - input.copyTo(processBuffer); +// input.copyTo(processBuffer); if (shouldFlip) { - Core.flip(processBuffer, processBuffer, flip.value); + Core.flip(input, input, flip.value); } if (shouldRotate) { - Core.rotate(processBuffer, processBuffer, rotation.value); + Core.rotate(input, input, rotation.value); } - processBuffer.copyTo(outputMat); - processBuffer.release(); +// processBuffer.copyTo(outputMat); +// processBuffer.release(); } else { - input.copyTo(outputMat); +// input.copyTo(outputMat); } long processTime = System.nanoTime() - processStartNanos; - return Pair.of(outputMat, processTime); + return Pair.of(input, processTime); } } diff --git a/chameleon-server/src/main/java/com/chameleonvision/web/RequestHandler.java b/chameleon-server/src/main/java/com/chameleonvision/web/RequestHandler.java index 013c800f9..34bff6030 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/RequestHandler.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/RequestHandler.java @@ -5,6 +5,7 @@ import com.chameleonvision.network.NetworkIPMode; import com.chameleonvision.vision.VisionManager; import com.chameleonvision.vision.VisionProcess; import com.chameleonvision.vision.camera.CameraCapture; +import com.chameleonvision.vision.camera.USBCameraCapture; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.javalin.http.Context; @@ -40,7 +41,7 @@ public class RequestHandler { Map camSettings = objectMapper.readValue(ctx.body(), Map.class); VisionProcess currentVisionProcess = VisionManager.getCurrentUIVisionProcess(); - CameraCapture currentCamera = currentVisionProcess.getCamera(); + USBCameraCapture currentCamera = currentVisionProcess.getCamera(); double newFOV; try { 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 983b4ecbf..1a1b504bd 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java +++ b/chameleon-server/src/main/java/com/chameleonvision/web/SocketHandler.java @@ -4,6 +4,7 @@ import com.chameleonvision.config.ConfigManager; import com.chameleonvision.vision.VisionManager; import com.chameleonvision.vision.VisionProcess; import com.chameleonvision.vision.camera.CameraCapture; +import com.chameleonvision.vision.camera.USBCameraCapture; import com.chameleonvision.vision.enums.StreamDivisor; import com.chameleonvision.vision.pipeline.CVPipeline; import com.chameleonvision.vision.pipeline.CVPipelineSettings; @@ -234,7 +235,7 @@ public class SocketHandler { private static HashMap getOrdinalCameraSettings() { HashMap tmp = new HashMap<>(); VisionProcess currentVisionProcess = VisionManager.getCurrentUIVisionProcess(); - CameraCapture currentCamera = VisionManager.getCurrentUIVisionProcess().getCamera(); + USBCameraCapture currentCamera = VisionManager.getCurrentUIVisionProcess().getCamera(); tmp.put("fov", currentCamera.getProperties().getFOV()); tmp.put("streamDivisor", currentVisionProcess.cameraStreamer.getDivisor().ordinal()); tmp.put("resolution", currentVisionProcess.getCamera().getProperties().getCurrentVideoModeIndex()); diff --git a/chameleon-server/src/test/java/com/chameleonvision/config/StaticCaptureTest.java b/chameleon-server/src/test/java/com/chameleonvision/config/StaticCaptureTest.java new file mode 100644 index 000000000..267a93220 --- /dev/null +++ b/chameleon-server/src/test/java/com/chameleonvision/config/StaticCaptureTest.java @@ -0,0 +1,66 @@ +package com.chameleonvision.config; + +import com.chameleonvision.util.ProgramDirectoryUtilities; +import com.chameleonvision.vision.image.StaticImageCapture; +import com.chameleonvision.vision.pipeline.CVPipeline2d; +import edu.wpi.cscore.CameraServerCvJNI; +import edu.wpi.cscore.CameraServerJNI; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; + +class StaticCaptureTest { + + private static final List allowedImageExtensions = List.of(".jpg", ".jpeg", ".png"); + + private static final FilenameFilter imageExtensionFilter = (dir, name) -> allowedImageExtensions.stream().anyMatch(name::endsWith); + + private static final LinkedHashMap loadedImages = new LinkedHashMap<>(); + + @BeforeAll + static void setup() { + try { + CameraServerJNI.forceLoad(); + CameraServerCvJNI.forceLoad(); + } catch (IOException e) { + throw new RuntimeException("Failed to load JNI libraries!"); + } + } + + @Test + void ImageLoadTest() { + Path imagesFolder = Paths.get(ProgramDirectoryUtilities.getProgramDirectory(), "testimages", "2019"); + if (Files.exists(imagesFolder)) { + File dir = new File(imagesFolder.toString()); + File[] imageFiles = dir.listFiles(imageExtensionFilter); + + Assertions.assertNotNull(imageFiles); + + for (File imageFile : imageFiles) { + loadedImages.put(imageFile.getName().replace(".jpg", ""), new StaticImageCapture(imageFile.toPath(), 68.5)); + } + + Assertions.assertEquals(loadedImages.size(), imageFiles.length); + } + } + + @Test + void ImageProcessTest() { + ImageLoadTest(); + CVPipeline2d testPipeline = new CVPipeline2d(); + String testImage1 = "CargoSideStraightDark36in"; + StaticImageCapture testCapture1 = loadedImages.get(testImage1); + + testPipeline.initPipeline(testCapture1); + } +} \ No newline at end of file