blob: 7b80158c95bdb22f78f9ca85be5900e71ebae2e0 [file] [log] [blame]
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;
import edu.wpi.first.wpijavacv.WPIImage;
/* 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;
private Recognizer recognizer = new Recognizer2013();
public VisionTuner(String[] imageFilenames) {
cameraFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
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 cameraImage = testImages[currentIndex];
cameraFrame.setTitle(testImageFilenames[currentIndex]);
WPIImage processedImage = recognizer.processImage(cameraImage);
cameraFrame.showImage(processedImage.getBufferedImage());
}
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();
}
}
}