blob: 7b80158c95bdb22f78f9ca85be5900e71ebae2e0 [file] [log] [blame]
jerrymcb7a06a2013-02-17 22:32:29 +00001package org.frc971;
2
3import java.awt.event.KeyEvent;
4import java.io.File;
5import java.io.IOException;
6
7import javax.imageio.ImageIO;
8import javax.swing.WindowConstants;
9
10import com.googlecode.javacv.CanvasFrame;
11
12import edu.wpi.first.wpijavacv.WPIColorImage;
jerrym6ebe6452013-02-18 03:00:31 +000013import edu.wpi.first.wpijavacv.WPIImage;
jerrymcb7a06a2013-02-17 22:32:29 +000014
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 */
34public class VisionTuner {
35 private String[] testImageFilenames;
36 private WPIColorImage[] testImages;
37 private final CanvasFrame cameraFrame = new CanvasFrame("Camera");
38 private int currentIndex = 0;
jerrym6ebe6452013-02-18 03:00:31 +000039 private Recognizer recognizer = new Recognizer2013();
jerrymcb7a06a2013-02-17 22:32:29 +000040
41 public VisionTuner(String[] imageFilenames) {
42 cameraFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
jerrymcb7a06a2013-02-17 22:32:29 +000043
44 loadTestImages(imageFilenames);
45 }
46
jerrymcb7a06a2013-02-17 22:32:29 +000047 /**
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 {
jerrym6ebe6452013-02-18 03:00:31 +000061 rawImage = new WPIColorImage(ImageIO.read(
62 new File(imageFilename)));
jerrymcb7a06a2013-02-17 22:32:29 +000063 } catch (IOException e) {
jerrym6ebe6452013-02-18 03:00:31 +000064 System.err.println("Couldn't load image file: " + imageFilename
65 + ": " + e.getMessage());
jerrymcb7a06a2013-02-17 22:32:29 +000066 System.exit(1);
67 return;
68 }
69 testImages[i] = rawImage;
70 }
71 }
72
73 private void processCurrentImage() {
jerrym6ebe6452013-02-18 03:00:31 +000074 WPIColorImage cameraImage = testImages[currentIndex];
jerrymcb7a06a2013-02-17 22:32:29 +000075 cameraFrame.setTitle(testImageFilenames[currentIndex]);
jerrym6ebe6452013-02-18 03:00:31 +000076
77 WPIImage processedImage = recognizer.processImage(cameraImage);
78 cameraFrame.showImage(processedImage.getBufferedImage());
jerrymcb7a06a2013-02-17 22:32:29 +000079 }
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}