A skeletal machine vision program.
Tap the left and right arrow keys to step through the test images.
git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4115 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/971CV/src/org/frc971/VisionTuner.java b/971CV/src/org/frc971/VisionTuner.java
new file mode 100644
index 0000000..7ecd98a
--- /dev/null
+++ b/971CV/src/org/frc971/VisionTuner.java
@@ -0,0 +1,120 @@
+package org.frc971;
+
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+import javax.swing.WindowConstants;
+
+import com.googlecode.javacv.CanvasFrame;
+
+import edu.wpi.first.wpijavacv.WPIColorImage;
+
+/* REQUIRED JAVA LIBRARIES:
+ * Program Files/SmartDashboard/
+ * extensions/lib/javacpp.jar
+ * extensions/lib/javacv-YOUR_OS.jar
+ * extensions/lib/javacv.jar
+ * extensions/lib/WPIJavaCV.jar
+ * SmartDashboard.jar -- maybe in the future
+ * extensions/WPICameraExtension.jar -- maybe in the future
+ *
+ * REQUIRED NATIVE CODE LIBRARIES:
+ * Program Files/WPIJavaCV/
+ * JavaCV_2.2.0/javacv-bin/javacv-YOUR_OS.jar
+ * OpenCV_2.2.0/bin/*
+ */
+/**
+ * FRC 2013 vision-target recognizer tuner app.
+ *
+ * @author jerry
+ */
+public class VisionTuner {
+ private String[] testImageFilenames;
+ private WPIColorImage[] testImages;
+ private final CanvasFrame cameraFrame = new CanvasFrame("Camera");
+ private int currentIndex = 0;
+
+ public VisionTuner(String[] imageFilenames) {
+ cameraFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+ cameraFrame.setFocusable(true);
+ cameraFrame.requestFocus();
+
+ loadTestImages(imageFilenames);
+ }
+
+
+ /**
+ * Loads the named test image files.
+ * Sets testImageFilenames and testImages.
+ */
+ private void loadTestImages(String[] imageFilenames) {
+ testImageFilenames = imageFilenames;
+ testImages = new WPIColorImage[testImageFilenames.length];
+
+ for (int i = 0; i < testImageFilenames.length; i++) {
+ String imageFilename = testImageFilenames[i];
+
+ System.out.println("Loading image file: " + imageFilename);
+ WPIColorImage rawImage = null;
+ try {
+ rawImage = new WPIColorImage(ImageIO.read(new File(imageFilename)));
+ } catch (IOException e) {
+ System.err.println("Couldn't load image file: " + imageFilename + ": " + e.getMessage());
+ System.exit(1);
+ return;
+ }
+ testImages[i] = rawImage;
+ }
+ }
+
+ private void processCurrentImage() {
+ WPIColorImage rawImage = testImages[currentIndex];
+ cameraFrame.showImage(rawImage.getBufferedImage());
+ cameraFrame.setTitle(testImageFilenames[currentIndex]);
+ }
+
+ private void previousImage() {
+ if (currentIndex > 0) {
+ --currentIndex;
+ }
+ processCurrentImage();
+ }
+
+ private void nextImage() {
+ if (currentIndex + 1 < testImages.length) {
+ ++currentIndex;
+ }
+ processCurrentImage();
+ }
+
+ private void processEvents() {
+ KeyEvent e = cameraFrame.waitKey();
+
+ switch (e.getKeyCode()) {
+ case KeyEvent.VK_LEFT:
+ previousImage();
+ break;
+ case KeyEvent.VK_RIGHT:
+ nextImage();
+ break;
+ }
+ }
+
+ public static void main(final String[] args) {
+ if (args.length == 0) {
+ System.err.println("Usage: " + VisionTuner.class.getName()
+ + " test image filenames...");
+ System.exit(1);
+ }
+
+ VisionTuner tuner = new VisionTuner(args);
+ tuner.processCurrentImage();
+
+ for (;;) {
+ tuner.processEvents();
+ }
+ }
+
+}