blob: f23b541ad2b3604e9be14320a08bc5c180020b29 [file] [log] [blame]
#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);
}