git-svn-id: https://robotics.mvla.net/svn/frc971/2013/trunk/src@4142 f308d9b7-e957-4cde-b6ac-9a88185e7312
diff --git a/971CV/src/org/frc971/HTTPClient.java b/971CV/src/org/frc971/HTTPClient.java
index 9813595..4e42553 100644
--- a/971CV/src/org/frc971/HTTPClient.java
+++ b/971CV/src/org/frc971/HTTPClient.java
@@ -1,6 +1,6 @@
package org.frc971;
-//Author: Daniel Petti
+//@author: daniel
import java.io.*;
import java.net.*;
@@ -8,25 +8,27 @@
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
-import com.googlecode.javacv.cpp.opencv_core.IplImage;
-
import aos.ChannelImageGetter;
import java.nio.channels.SocketChannel;
import java.nio.ByteBuffer;
+import edu.wpi.first.wpijavacv.WPIColorImage;
+
public class HTTPClient {
//Connects to HTTP Server on robot and receives images
private final static boolean LOCAL_DEBUG = true;
- private SocketChannel sock = SocketChannel.open();
- private Socket core_sock = sock.socket();
+ private SocketChannel sock;
+ private Socket core_sock;
private BufferedReader sock_in;
private PrintWriter sock_out;
+ private final String ATOM_IP = "10.9.71.6";
+
private void WriteDebug(String message) {
//small helper function to write debug messages
if (LOCAL_DEBUG)
@@ -77,8 +79,10 @@
public HTTPClient() {
//Initialize socket connection to robot
try {
+ sock = SocketChannel.open();
+ core_sock = sock.socket();
WriteDebug("Connecting to server...");
- sock.connect(new InetSocketAddress("192.168.0.137", 9714));
+ sock.connect(new InetSocketAddress(ATOM_IP, 9714));
sock_in = new BufferedReader(new InputStreamReader(core_sock.getInputStream()));
sock_out = new PrintWriter(core_sock.getOutputStream(), true);
//Write headers
@@ -110,7 +114,7 @@
InputStream in = new ByteArrayInputStream(binary_image.array());
try {
BufferedImage bImageFromConvert = ImageIO.read(in);
- final_image.image = IplImage.createFrom(bImageFromConvert);
+ final_image.image = new WPIColorImage(bImageFromConvert);
final_image.timestamp = cgetter.getTimestamp();
WriteDebug("Image processing successful.");
return final_image;
diff --git a/971CV/src/org/frc971/ImageWithTimestamp.java b/971CV/src/org/frc971/ImageWithTimestamp.java
index 633517d..38f6937 100644
--- a/971CV/src/org/frc971/ImageWithTimestamp.java
+++ b/971CV/src/org/frc971/ImageWithTimestamp.java
@@ -1,8 +1,8 @@
package org.frc971;
-import com.googlecode.javacv.cpp.opencv_core.IplImage;
+import edu.wpi.first.wpijavacv.WPIColorImage;
public class ImageWithTimestamp {
- IplImage image;
+ WPIColorImage image;
double timestamp;
}
diff --git a/971CV/src/org/frc971/TestImageGetter.java b/971CV/src/org/frc971/TestImageGetter.java
new file mode 100644
index 0000000..1f80520
--- /dev/null
+++ b/971CV/src/org/frc971/TestImageGetter.java
@@ -0,0 +1,92 @@
+/**
+ *
+ */
+package org.frc971;
+
+/**
+ * @author daniel
+ *
+ */
+
+//get debug images for Java camera processor
+
+import javax.imageio.ImageIO;
+
+import edu.wpi.first.wpijavacv.WPIColorImage;
+
+import java.io.File;
+import java.io.IOException;
+
+public class TestImageGetter {
+ private String path_to_images;
+ final static String[] images = {"45in_DoubleGreen.jpg",
+ "57inLargeTarget_DoubleGreenBK.jpg",
+ "FullField_DoubleGreenBK3.jpg",
+ "FullField_SmallGreen.jpg",
+ "HybridLine_DoubleGreenBK2.jpg",
+ "HybridLine_DoubleGreenBK3.jpg",
+ "HybridLine_DoubleGreenBK4.jpg",
+ "HybridLine_SmallGreen2.jpg",
+ "HybridLine_SmallGreen3.jpg",
+ "HybridLine_SmallGreen4.jpg",
+ "Midfield_DoubleGreenBK2.jpg",
+ "Midfield_SmallGreen2.jpg",
+ "Midfield_SmallGreen3.jpg",
+ "Midfield_SmallGreen4.jpg",
+ "OppLine_DoubleGreenBK2.jpg",
+ "OppLine_SmallGreen2.jpg",
+ "PyramidRight_DoubleGreenBK2.jpg",
+ "PyramidRight_SmallGreen2.jpg"
+ };
+
+ private int image_index = -1;
+
+ private WPIColorImage current_image = null;
+
+ private String cocatenate_paths(String path1, String path2) {
+ if (path1.charAt(path1.length() - 1) == '/')
+ return path1 + path2;
+ else
+ return path1 + "/" + path2;
+ }
+ public TestImageGetter(String path_to_images) {
+ this.path_to_images = path_to_images;
+ }
+ public WPIColorImage GetNext() {
+ image_index++;
+ if (image_index < images.length) {
+ String image_to_get = images[image_index];
+ try {
+ current_image = new WPIColorImage(ImageIO.read(new File(cocatenate_paths(path_to_images, image_to_get))));
+ return current_image;
+ }
+ catch (IOException e) {
+ System.err.println("Could not open file.");
+ return null;
+ }
+ }
+ else
+ image_index--;
+ return null;
+ }
+ public WPIColorImage GetPrev() {
+ image_index--;
+ if (image_index >= 0) {
+ String image_to_get = images[image_index];
+ try {
+ current_image = new WPIColorImage(ImageIO.read(new File(cocatenate_paths(path_to_images, image_to_get))));
+ return current_image;
+ }
+ catch (IOException e) {
+ System.err.println("Could not open file.");
+ return null;
+ }
+ }
+ else
+ image_index++;
+ return null;
+ }
+ public WPIColorImage GetCurrent() {
+ return current_image;
+ }
+}
diff --git a/971CV/src/org/frc971/VisionTuner.java b/971CV/src/org/frc971/VisionTuner.java
index ef29e36..c664391 100644
--- a/971CV/src/org/frc971/VisionTuner.java
+++ b/971CV/src/org/frc971/VisionTuner.java
@@ -3,10 +3,8 @@
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
-import java.io.File;
-import java.io.IOException;
+import java.util.Arrays;
-import javax.imageio.ImageIO;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.WindowConstants;
@@ -14,7 +12,6 @@
import javax.swing.event.ChangeListener;
import com.googlecode.javacv.CanvasFrame;
-
import edu.wpi.first.wpijavacv.WPIColorImage;
import edu.wpi.first.wpijavacv.WPIImage;
@@ -39,11 +36,9 @@
* See {@link #processEvents()} for the keystroke commands.
*
* @author jerry
+ * @author daniel
*/
public class VisionTuner {
- private String[] testImageFilenames;
- private WPIColorImage[] testImages;
- private int currentIndex = 0;
private Recognizer recognizer = new Recognizer2013();
private final CanvasFrame cameraFrame = new CanvasFrame("Camera");
@@ -57,11 +52,12 @@
private double totalMsec;
private double minMsec = Double.MAX_VALUE;
private double maxMsec;
+
+ private TestImageGetter getter;
- public VisionTuner(String[] imageFilenames) {
+ public VisionTuner() {
cameraFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- loadTestImages(imageFilenames);
recognizer.showIntermediateStages(true);
cameraFrame.getContentPane().add(panel, BorderLayout.SOUTH);
@@ -79,7 +75,7 @@
hueMinSlider.getValue(), hueMaxSlider.getValue(),
satMinSlider.getValue(),
valMinSlider.getValue());
- processCurrentImage();
+ processImage(getter.GetCurrent());
}
};
@@ -119,32 +115,9 @@
* Loads the named test image files.
* Sets testImageFilenames and testImages.
*/
- private void loadTestImages(String[] imageFilenames) {
- testImageFilenames = imageFilenames;
- testImages = new WPIColorImage[testImageFilenames.length];
- currentIndex = 0;
- 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]);
+ private void processImage(WPIColorImage cameraImage) {
+ cameraFrame.setTitle("Test Images:");
long startTime = System.nanoTime();
WPIImage processedImage = recognizer.processImage(cameraImage);
@@ -164,17 +137,15 @@
}
private void previousImage() {
- if (currentIndex > 0) {
- --currentIndex;
- }
- processCurrentImage();
+ WPIColorImage to_process = getter.GetPrev();
+ if (to_process != null)
+ processImage(to_process);
}
private void nextImage() {
- if (currentIndex + 1 < testImages.length) {
- ++currentIndex;
- }
- processCurrentImage();
+ WPIColorImage to_process = getter.GetNext();
+ if (to_process != null)
+ processImage(to_process);
}
private void processEvents() {
@@ -198,17 +169,28 @@
}
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();
+ if (Arrays.asList(args).contains("-debug")) {
+ //debug mode has been requested
+ tuner.getter = new TestImageGetter(".");
+ WPIColorImage to_process = tuner.getter.GetNext();
+ if (to_process != null)
+ tuner.processImage(to_process);
+ else
+ System.err.println("Cannot find test images.");
+ for (;;) {
+ tuner.processEvents();
+ }
}
-
- VisionTuner tuner = new VisionTuner(args);
- tuner.processCurrentImage();
-
- for (;;) {
- tuner.processEvents();
+ else {
+ HTTPClient client = new HTTPClient();
+ for (;;) {
+ ImageWithTimestamp to_process = client.GetFrame();
+ if (to_process.image != null) {
+ tuner.processImage(to_process.image);
+ System.out.println("Captured time: " + Double.toString(to_process.timestamp));
+ }
+ }
}
}