jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 1 | package org.frc971;
|
| 2 |
|
| 3 | import java.awt.event.KeyEvent;
|
| 4 | import java.io.File;
|
| 5 | import java.io.IOException;
|
| 6 |
|
| 7 | import javax.imageio.ImageIO;
|
| 8 | import javax.swing.WindowConstants;
|
| 9 |
|
| 10 | import com.googlecode.javacv.CanvasFrame;
|
| 11 |
|
| 12 | import edu.wpi.first.wpijavacv.WPIColorImage;
|
jerrym | 6ebe645 | 2013-02-18 03:00:31 +0000 | [diff] [blame] | 13 | import edu.wpi.first.wpijavacv.WPIImage;
|
jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 14 |
|
| 15 | /* REQUIRED JAVA LIBRARIES:
|
| 16 | * Program Files/SmartDashboard/
|
| 17 | * extensions/lib/javacpp.jar
|
| 18 | * extensions/lib/javacv-YOUR_OS.jar
|
| 19 | * extensions/lib/javacv.jar
|
| 20 | * extensions/lib/WPIJavaCV.jar
|
| 21 | * SmartDashboard.jar -- maybe in the future
|
| 22 | * extensions/WPICameraExtension.jar -- maybe in the future
|
| 23 | *
|
| 24 | * REQUIRED NATIVE CODE LIBRARIES:
|
| 25 | * Program Files/WPIJavaCV/
|
| 26 | * JavaCV_2.2.0/javacv-bin/javacv-YOUR_OS.jar
|
| 27 | * OpenCV_2.2.0/bin/*
|
| 28 | */
|
| 29 | /**
|
| 30 | * FRC 2013 vision-target recognizer tuner app.
|
| 31 | *
|
| 32 | * @author jerry
|
| 33 | */
|
| 34 | public class VisionTuner {
|
| 35 | private String[] testImageFilenames;
|
| 36 | private WPIColorImage[] testImages;
|
| 37 | private final CanvasFrame cameraFrame = new CanvasFrame("Camera");
|
| 38 | private int currentIndex = 0;
|
jerrym | 6ebe645 | 2013-02-18 03:00:31 +0000 | [diff] [blame] | 39 | private Recognizer recognizer = new Recognizer2013();
|
jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 40 |
|
| 41 | public VisionTuner(String[] imageFilenames) {
|
| 42 | cameraFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 43 |
|
| 44 | loadTestImages(imageFilenames);
|
| 45 | }
|
| 46 |
|
jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 47 | /**
|
| 48 | * Loads the named test image files.
|
| 49 | * Sets testImageFilenames and testImages.
|
| 50 | */
|
| 51 | private void loadTestImages(String[] imageFilenames) {
|
| 52 | testImageFilenames = imageFilenames;
|
| 53 | testImages = new WPIColorImage[testImageFilenames.length];
|
| 54 |
|
| 55 | for (int i = 0; i < testImageFilenames.length; i++) {
|
| 56 | String imageFilename = testImageFilenames[i];
|
| 57 |
|
| 58 | System.out.println("Loading image file: " + imageFilename);
|
| 59 | WPIColorImage rawImage = null;
|
| 60 | try {
|
jerrym | 6ebe645 | 2013-02-18 03:00:31 +0000 | [diff] [blame] | 61 | rawImage = new WPIColorImage(ImageIO.read(
|
| 62 | new File(imageFilename)));
|
jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 63 | } catch (IOException e) {
|
jerrym | 6ebe645 | 2013-02-18 03:00:31 +0000 | [diff] [blame] | 64 | System.err.println("Couldn't load image file: " + imageFilename
|
| 65 | + ": " + e.getMessage());
|
jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 66 | System.exit(1);
|
| 67 | return;
|
| 68 | }
|
| 69 | testImages[i] = rawImage;
|
| 70 | }
|
| 71 | }
|
| 72 |
|
| 73 | private void processCurrentImage() {
|
jerrym | 6ebe645 | 2013-02-18 03:00:31 +0000 | [diff] [blame] | 74 | WPIColorImage cameraImage = testImages[currentIndex];
|
jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 75 | cameraFrame.setTitle(testImageFilenames[currentIndex]);
|
jerrym | 6ebe645 | 2013-02-18 03:00:31 +0000 | [diff] [blame] | 76 |
|
| 77 | WPIImage processedImage = recognizer.processImage(cameraImage);
|
| 78 | cameraFrame.showImage(processedImage.getBufferedImage());
|
jerrym | cb7a06a | 2013-02-17 22:32:29 +0000 | [diff] [blame] | 79 | }
|
| 80 |
|
| 81 | private void previousImage() {
|
| 82 | if (currentIndex > 0) {
|
| 83 | --currentIndex;
|
| 84 | }
|
| 85 | processCurrentImage();
|
| 86 | }
|
| 87 |
|
| 88 | private void nextImage() {
|
| 89 | if (currentIndex + 1 < testImages.length) {
|
| 90 | ++currentIndex;
|
| 91 | }
|
| 92 | processCurrentImage();
|
| 93 | }
|
| 94 |
|
| 95 | private void processEvents() {
|
| 96 | KeyEvent e = cameraFrame.waitKey();
|
| 97 |
|
| 98 | switch (e.getKeyCode()) {
|
| 99 | case KeyEvent.VK_LEFT:
|
| 100 | previousImage();
|
| 101 | break;
|
| 102 | case KeyEvent.VK_RIGHT:
|
| 103 | nextImage();
|
| 104 | break;
|
| 105 | }
|
| 106 | }
|
| 107 |
|
| 108 | public static void main(final String[] args) {
|
| 109 | if (args.length == 0) {
|
| 110 | System.err.println("Usage: " + VisionTuner.class.getName()
|
| 111 | + " test image filenames...");
|
| 112 | System.exit(1);
|
| 113 | }
|
| 114 |
|
| 115 | VisionTuner tuner = new VisionTuner(args);
|
| 116 | tuner.processCurrentImage();
|
| 117 |
|
| 118 | for (;;) {
|
| 119 | tuner.processEvents();
|
| 120 | }
|
| 121 | }
|
| 122 |
|
| 123 | }
|