diff --git a/vision/tests/FieldDBGCamProc.cpp b/vision/tests/FieldDBGCamProc.cpp
new file mode 100644
index 0000000..f23b541
--- /dev/null
+++ b/vision/tests/FieldDBGCamProc.cpp
@@ -0,0 +1,210 @@
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <vector>
+
+#include "../CameraProcessor.h"
+#include "../SensorProcessor.h"
+
+#include "opencv2/highgui/highgui.hpp"
+
+const int num_names = 39;
+
+
+static const bool USE_ROTATED = true;
+static const int use_width = 320;
+static const int use_height = 240;
+const char * image_names[num_names] = {
+			"NASA_bmp/img26_series_b_side_204_e65.jpg",
+			"NASA_bmp/img19_series_b_side_110_e65.jpg",
+			"NASA_bmp/img12_series_b_center_224_e65.jpg",
+			"NASA_bmp/img23_series_b_side_101_e65.jpg",
+			"NASA_bmp/img15_series_b_side_230_e65.jpg",
+			"NASA_bmp/img10_series_b_center_203_e65.jpg",
+			"NASA_bmp/img11_series_b_center_203_e65.jpg",
+			"NASA_bmp/img13_series_b_center_260_e65.jpg",
+			"NASA_bmp/img14_series_b_center_251_e65.jpg",
+			"NASA_bmp/img16_series_b_side_196_e65.jpg",
+			"NASA_bmp/img17_series_b_side_160_e65.jpg",
+			"NASA_bmp/img18_series_b_side_140_e65.jpg",
+			"NASA_bmp/img1_center_200_e65.jpg",
+			"NASA_bmp/img20_series_b_side_114_e65.jpg",
+			"NASA_bmp/img21_series_b_side_137_e65.jpg",
+			"NASA_bmp/img22_center field_e10.jpg",
+			"NASA_bmp/img22_dog Center Field_e10.jpg",
+			"NASA_bmp/img22_series_b_side_150_e65.jpg",
+			"NASA_bmp/img23_center field_e10.jpg",
+			"NASA_bmp/img24_center field_e10.jpg",
+			"NASA_bmp/img24_series_b_side_104_e65.jpg",
+			"NASA_bmp/img25_series_b_side_195_e65.jpg",
+			"NASA_bmp/img27_series_b_side_192_e65.jpg",
+			"NASA_bmp/img28_series_b_side_192_e65.jpg",
+			"NASA_bmp/img29_series_b_side_186_e65.jpg",
+			"NASA_bmp/img2_center_207_e65.jpg",
+			"NASA_bmp/img30_series_b_side_177_e65.jpg",
+			"NASA_bmp/img31_series_b_side_176_e65.jpg",
+			"NASA_bmp/img32_series_b_side_212_e65.jpg",
+			"NASA_bmp/img33_series_b_side_251_e65.jpg",
+			"NASA_bmp/img34_series_b_side_272_e65.jpg",
+			"NASA_bmp/img35_series_b_side_23+219_e65.jpg",
+			"NASA_bmp/img3_center_180_e65.jpg",
+			"NASA_bmp/img4_series_b_center_106_e65.jpg",
+			"NASA_bmp/img5_series_b_center_122_e65.jpg",
+			"NASA_bmp/img6_series_b_center_145_e65.jpg",
+			"NASA_bmp/img7_series_b_center_174_e65.jpg",
+			"NASA_bmp/img8_series_b_center_196_e65.jpg",
+			"NASA_bmp/img9_series_b_center_201_e65.jpg"};
+
+const char	* WINDOW_NAME	= "Treshhold Window";
+const char	* WINDOW_NAME2	= "Target Window";
+
+
+static void onMouse( int event, int x, int y, int, void* userData ) {
+	if( event != CV_EVENT_LBUTTONDOWN ) return;
+	ProcessorData *proc = (ProcessorData *) userData;
+	IplImage *image = proc->src_header_image;
+	uchar b = *((uchar*) (image->imageData + y*image->widthStep + 3*x));
+	uchar g = *((uchar*) (image->imageData + y*image->widthStep + 3*(x+1)));
+	uchar r = *((uchar*) (image->imageData + y*image->widthStep + 3*(x+2)));
+	
+	uchar h=0;
+	uchar s=0;
+	uchar v=0;
+	proc->RGBtoHSV(r, g, b, &h, &s, &v);
+
+	
+	*((uchar*) (image->imageData + y*image->widthStep + 3*x)) = 128;
+	*((uchar*) (image->imageData + y*image->widthStep + 3*(x+1))) = 128;
+	*((uchar*) (image->imageData + y*image->widthStep + 3*(x+2))) = 255;
+	
+	cv::Mat src(image);
+	//cv::imshow("test", src);
+
+	printf("got click (%d,%d)= <%d,%d,%d> -- [%d,%d,%d]\n",
+			x, y, r, g, b, h, s, v);
+}
+
+
+int main( int argc, char *argv[] ){
+	ProcessorData processor(use_width, use_height, USE_ROTATED);
+	int img_cycle = 0;
+	int thresh = 100;
+	
+	cvStartWindowThread();
+
+	cvNamedWindow ("cnt", CV_WINDOW_AUTOSIZE);
+	cvNamedWindow ("GLOBAL", CV_WINDOW_AUTOSIZE);
+	//cvNamedWindow ("Grey Img", CV_WINDOW_AUTOSIZE);
+	//cvNamedWindow ("test", CV_WINDOW_AUTOSIZE);
+	cvNamedWindow (WINDOW_NAME2, CV_WINDOW_AUTOSIZE);
+	cvNamedWindow (WINDOW_NAME, CV_WINDOW_AUTOSIZE);
+
+	cvMoveWindow(WINDOW_NAME,0,0);
+	cvMoveWindow("GLOBAL",325,0);
+	cvMoveWindow(WINDOW_NAME2,650,0);
+	//cvMoveWindow("Grey Img", 0, 275);
+	//cvMoveWindow("test", 325, 275);
+	cvMoveWindow("cnt",1100,100);
+	//Creating the trackbars
+	cvCreateTrackbar("H1","cnt",&processor.h1,360,0);
+	cvCreateTrackbar("H2","cnt",&processor.h2,360,0);
+	cvCreateTrackbar("S1","cnt",&processor.s1,255,0);
+	cvCreateTrackbar("S2","cnt",&processor.s2,255,0);
+	cvCreateTrackbar("V1","cnt",&processor.v1,255,0);
+	cvCreateTrackbar("V2","cnt",&processor.v2,255,0);
+	
+	while (img_cycle >= 0) {
+		processor.clear();
+		printf("%d = %s\n", img_cycle, image_names[img_cycle]);
+		processor.src_header_image = cvLoadImage(image_names[img_cycle]);
+		cvCopy(processor.src_header_image, processor.global_display);
+
+		cv::setMouseCallback( WINDOW_NAME2, onMouse,
+				(void *)&processor );
+
+		cv::Mat global_mat(processor.global_display);
+		cv::Mat src_mat(processor.src_header_image);
+
+		// These lines are the vision processing, the rest of main
+		// is just fluff
+		processor.threshold((uchar *)
+				processor.src_header_image->imageData);
+		processor.getContours();
+		processor.filterToTargets();
+
+		if(!processor.target_list.empty()){
+			std::vector<std::vector<cv::Point> > target_contours;
+			std::vector<std::vector<cv::Point> > best_contours;
+			std::vector<std::vector<cv::Point> > raw_contours;
+			std::vector<Target>::iterator target_it;
+			Target *best_target = NULL;
+			int i = 0;
+			for(target_it = processor.target_list.begin();
+					target_it != processor.target_list.end(); target_it++){
+				target_contours.push_back(target_it->this_contour);
+				raw_contours.push_back(target_it->raw_contour);
+				printf("%d: h=%.1f, interp=%.1f, <x,y>=<%.1f,%.1f>\n",
+						i++, target_it->height,
+						interpolate(4, &pixel_to_dist[0], target_it->rect.centroid.x),
+						target_it->rect.centroid.x, target_it->rect.centroid.y);
+				if (best_target == NULL) {
+					best_target = &*target_it;
+				} else {
+					if (target_it->height > best_target->height) {
+						best_target = &*target_it;
+					}
+				/*	if (processor.is_90) {
+						if (target_it->rect.centroid.x > best_target->rect.centroid.x) {
+							best_target = &*target_it;
+						}
+					} else {
+						if (target_it->rect.centroid.y < best_target->rect.centroid.y) {
+							best_target = &*target_it;
+						}
+					}*/
+				}
+			}
+			best_contours.push_back(best_target->this_contour);
+			//drawContours(global_mat,target_contours,-1,color,CV_FILLED);
+			cv::imshow(WINDOW_NAME, src_mat);
+			//cv::imshow("Grey Img", *processor.grey_mat);
+			cv::Scalar color(0,0,255);
+			cv::drawContours( src_mat, target_contours, -1, color, CV_FILLED );
+			cv::Scalar color2(128,0,255);
+			cv::drawContours( src_mat, best_contours, -1, color2, CV_FILLED );
+			cv::Scalar color3(0,255,0);
+			cv::drawContours( src_mat, raw_contours, -1, color3, 1 );
+		}
+		//cv::Mat grey_mat(grey_image);
+		//cv::imshow(WINDOW_NAME2, grey_mat);
+		cv::imshow("GLOBAL", global_mat);
+		cv::imshow(WINDOW_NAME2, src_mat);
+		char key = cvWaitKey(3000);
+		switch (key) {
+			case ' ':
+				img_cycle++;
+				img_cycle = img_cycle % num_names;
+				printf("%c %d= %s\n", key, img_cycle, image_names[img_cycle]);
+				break;
+			case 'g':
+				thresh++;
+				thresh = (thresh % 255);
+				printf("+ thresh= %d\n", thresh);
+				break;
+			case 'G':
+				thresh--;
+				thresh = (thresh % 255);
+				printf("- thresh= %d\n", thresh);
+				break;
+			case 'q':
+				img_cycle = -1;
+				break;
+			default:
+				break;
+		}
+		//redraw image cuz we drew all over it
+	}
+
+	cvDestroyWindow(WINDOW_NAME);
+}
+
