00001 /*!@file VFAT/test-multiTrack.C Test IEEE1394 frame grabbing and X display */ 00002 00003 // //////////////////////////////////////////////////////////////////// // 00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the // 00005 // University of Southern California (USC) and the iLab at USC. // 00006 // See http://iLab.usc.edu for information about this project. // 00007 // //////////////////////////////////////////////////////////////////// // 00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected // 00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency // 00010 // in Visual Environments, and Applications'' by Christof Koch and // 00011 // Laurent Itti, California Institute of Technology, 2001 (patent // 00012 // pending; application number 09/912,225 filed July 23, 2001; see // 00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status). // 00014 // //////////////////////////////////////////////////////////////////// // 00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit. // 00016 // // 00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can // 00018 // redistribute it and/or modify it under the terms of the GNU General // 00019 // Public License as published by the Free Software Foundation; either // 00020 // version 2 of the License, or (at your option) any later version. // 00021 // // 00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope // 00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the // 00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // 00025 // PURPOSE. See the GNU General Public License for more details. // 00026 // // 00027 // You should have received a copy of the GNU General Public License // 00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write // 00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, // 00030 // Boston, MA 02111-1307 USA. // 00031 // //////////////////////////////////////////////////////////////////// // 00032 // 00033 // Primary maintainer for this file: T. Nathan Mundhenk <mundhenk@usc.edu> 00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/VFAT/test-multiTrack.C $ 00035 // $Id: test-multiTrack.C 14376 2011-01-11 02:44:34Z pez $ 00036 // 00037 00038 00039 #include "Component/ModelManager.H" 00040 #include "Component/ModelOptionDef.H" 00041 #include "Devices/CameraControl.H" 00042 #include "Devices/DeviceOpts.H" 00043 #include "Devices/FrameGrabberFactory.H" 00044 #include "GUI/XWindow.H" 00045 #include "VFAT/segmentImageMerge.H" 00046 #include "rutz/shared_ptr.h" 00047 00048 //#include <pthread.h> 00049 #include <cstdio> 00050 #include <cstdlib> 00051 #include <iostream> 00052 00053 // number of frames over which framerate info is averaged: 00054 #define NAVG 20 00055 00056 int main(const int argc, const char **argv) 00057 { 00058 00059 // instantiate a model manager: 00060 ModelManager manager("Multi Frame Grabber Tester"); 00061 manager.allowOptions(OPTEXP_NONE); 00062 00063 // Instantiate our various ModelComponents: 00064 00065 nub::soft_ref<FrameIstream> gb1(makeIEEE1394grabber(manager)); 00066 gb1->setModelParamVal("FrameGrabberSubChan", 0); 00067 //gb1->setModelParamVal("FrameGrabberGamma", 2); 00068 //gb1->setModelParamVal("framegrabber-whiteness", 1); 00069 00070 nub::soft_ref<FrameIstream> gb2(makeIEEE1394grabber(manager)); 00071 gb2->setModelParamVal("FrameGrabberSubChan", 1); 00072 //gb2->setModelParamVal("FrameGrabberGamma", 2); 00073 //gb2->setModelParamVal("framegrabber-whiteness", 100); 00074 00075 nub::soft_ref<FrameIstream> gb3(makeIEEE1394grabber(manager)); 00076 gb3->setModelParamVal("FrameGrabberSubChan", 2); 00077 //gb3->setModelParamVal("FrameGrabberGamma", 2); 00078 00079 nub::soft_ref<FrameIstream> gb4(makeIEEE1394grabber(manager)); 00080 gb4->setModelParamVal("FrameGrabberSubChan", 3); 00081 //gb3->setModelParamVal("framegrabber-whiteness", 1000); 00082 00083 //gb3->setModelParamVal("FrameGrabberChannel", 1); 00084 00085 manager.addSubComponent(gb1); 00086 manager.addSubComponent(gb2); 00087 manager.addSubComponent(gb3); 00088 manager.addSubComponent(gb4); 00089 00090 00091 // we don't want people messing around with some of our options; so 00092 // let's selectively export only those thay can play with: 00093 manager.allowOptions(OPTEXP_ALL); 00094 manager.doRequestOption(&OPT_FrameGrabberDims); 00095 manager.doRequestOption(&OPT_FrameGrabberMode); 00096 manager.doRequestOption(&OPT_FrameGrabberFPS); 00097 manager.doRequestOption(&OPT_FrameGrabberNbuf); 00098 manager.allowOptions(OPTEXP_NONE); 00099 00100 nub::soft_ref<CameraControl> 00101 camera1(new CameraControl(manager, "Camera Controller", "CameraControl", 00102 0, true, 0, 1, 1)); 00103 nub::soft_ref<CameraControl> 00104 camera2(new CameraControl(manager, "Camera Controller", "CameraControl", 00105 0, true, 2, 3, 1)); 00106 nub::soft_ref<CameraControl> 00107 camera3(new CameraControl(manager, "Camera Controller", "CameraControl", 00108 0, true, 4, 5, 1)); 00109 nub::soft_ref<CameraControl> 00110 camera4(new CameraControl(manager, "Camera Controller", "CameraControl", 00111 0, true, 6, 7, 1)); 00112 00113 manager.addSubComponent(camera1); 00114 manager.addSubComponent(camera2); 00115 manager.addSubComponent(camera3); 00116 manager.addSubComponent(camera4); 00117 00118 // Parse command-le: 00119 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1); 00120 00121 // do post-command-line configs: 00122 //nub::soft_ref<FrameIstream> gb1 = gbc1->getFrameGrabber(); 00123 //nub::soft_ref<FrameIstream> gb2 = gbc2->getFrameGrabber(); 00124 /*if (gb1.isInvalid()) 00125 LFATAL("You need to select a frame grabber type via the " 00126 "--fg-type=XX command-line option for this program " 00127 "to be useful"); 00128 if (gb2.isInvalid()) 00129 LFATAL("You need to select a frame grabber type via the " 00130 "--fg-type=XX command-line option for this program " 00131 "to be useful");*/ 00132 int width = gb1->getWidth(), height = gb1->getHeight(); 00133 float delay[4]; 00134 delay[0] = 0; delay[1] = 0; delay[2] = 0; delay[3] = 0; 00135 00136 // let's get all our ModelComponent instances started: 00137 manager.start(); 00138 XWindow wini1(Dims(width, height), 0, 0, "test-input window 1"); 00139 XWindow wini2(Dims(width, height), 0, 0, "test-input window 2"); 00140 XWindow wini3(Dims(width, height), 0, 0, "test-input window 3"); 00141 XWindow wini4(Dims(width, height), 0, 0, "test-input window 4"); 00142 00143 XWindow roomOver(Dims(400,400),0,0,"Room Overhead"); 00144 XWindow roomFront(Dims(400,400),0,0,"Room Front"); 00145 Image<PixRGB<byte> > overhead; 00146 Image<PixRGB<byte> > front; 00147 00148 00149 Timer tim; 00150 00151 Image< PixRGB<float> > fima; 00152 00153 std::vector< Image< PixRGB<byte> > > ima; 00154 ima.resize(4); 00155 00156 std::vector< Image< PixRGB<byte> > > display; 00157 display.resize(4); 00158 00159 Timer camPause[4]; // to pause the move command 00160 camPause[0].reset(); 00161 camPause[1].reset(); 00162 camPause[2].reset(); 00163 camPause[3].reset(); 00164 00165 uint64 t[NAVG]; int frame = 0; 00166 00167 // Create tracker and state how many trackers will be used 00168 segmentImageMerge segmenter(4); 00169 00170 //**************************** 00171 // set up tracking parameters 00172 //**************************** 00173 00174 // HSV mean color to start with and standard deviation 00175 //segmenter.setTrackColor(12,8,0.23,0.08,135,35,0,true,15); 00176 //segmenter.setTrackColor(12,8,0.23,0.08,135,35,1,true,15); 00177 //segmenter.setTrackColor(12,8,0.23,0.08,135,35,2,true,15); 00178 //segmenter.setTrackColor(12,8,0.23,0.08,135,35,3,true,15); 00179 segmenter.setTrackColor(10,10,0.15,0.20,150,150,0,true,15); 00180 segmenter.setTrackColor(10,10,0.15,0.20,150,150,1,true,15); 00181 segmenter.setTrackColor(10,10,0.15,0.20,150,150,2,true,15); 00182 segmenter.setTrackColor(10,10,0.15,0.20,150,150,3,true,15); 00183 //segmenter.setTrackColor(13,7,0.17,0.3,156,150,0,true,15); 00184 //segmenter.setTrackColor(13,7,0.17,0.3,156,150,1,true,15); 00185 //segmenter.setTrackColor(13,7,0.17,0.3,156,150,2,true,15); 00186 //segmenter.setTrackColor(13,7,0.17,0.3,156,150,3,true,15); 00187 00188 // HSV Hard Boundaries (H.upper,H.lower,...,tracker) 00189 segmenter.setAdaptBound(20,5,.30,.15,170,100,0); 00190 segmenter.setAdaptBound(20,5,.30,.15,170,100,1); 00191 segmenter.setAdaptBound(20,5,.30,.15,170,100,2); 00192 segmenter.setAdaptBound(20,5,.30,.15,170,100,3); 00193 00194 00195 //segmenter.setAdaptBound(15,5,.30,.25,140,100,0); 00196 //segmenter.setAdaptBound(15,5,.30,.25,140,100,1); 00197 //segmenter.setAdaptBound(15,5,.30,.25,140,100,2); 00198 //segmenter.setAdaptBound(15,5,.30,.25,140,100,0); 00199 //segmenter.setAdaptBound(15,5,.30,.25,140,100,1); 00200 //segmenter.setAdaptBound(15,5,.30,.25,140,100,2); 00201 //segmenter.setAdaptBound(15,5,.30,.25,140,100,3); 00202 //segmenter.setAdaptBound(15,5,.30,.25,140,100,3); 00203 //segmenter.setAdaptBound(40,5,.40,.10,170,100,0); 00204 //segmenter.setAdaptBound(40,5,.40,.10,170,100,1); 00205 //segmenter.setAdaptBound(40,5,.40,.10,170,100,2); 00206 //segmenter.setAdaptBound(40,5,.40,.10,170,100,3); 00207 00208 // Inspection box size for each tracker 00209 segmenter.setFrame(0,0,width/4,height/4,width/4,height/4,0); 00210 segmenter.setFrame(0,0,width/4,height/4,width/4,height/4,1); 00211 segmenter.setFrame(0,0,width/4,height/4,width/4,height/4,2); 00212 segmenter.setFrame(0,0,width/4,height/4,width/4,height/4,3); 00213 00214 // RGB color of tracker circle for display 00215 segmenter.setCircleColor(0,255,0,0); 00216 segmenter.setCircleColor(0,255,0,1); 00217 segmenter.setCircleColor(0,255,0,2); 00218 segmenter.setCircleColor(0,255,0,3); 00219 00220 // RGB color of tracker bounding box for display 00221 segmenter.setBoxColor(255,255,0,0); 00222 segmenter.setBoxColor(255,255,0,1); 00223 segmenter.setBoxColor(255,255,0,2); 00224 segmenter.setBoxColor(255,255,0,3); 00225 00226 // set what type of color adaptation to use and if to use it 00227 segmenter.setAdapt(3,true,3,true,3,true,0); 00228 segmenter.setAdapt(3,true,3,true,3,true,1); 00229 segmenter.setAdapt(3,true,3,true,3,true,2); 00230 segmenter.setAdapt(3,true,3,true,3,true,3); 00231 00232 CameraParams* params = (CameraParams*)calloc(4, sizeof(CameraParams)); 00233 CameraParams* tempParams = (CameraParams*)calloc(2, sizeof(CameraParams)); 00234 PixelPoint* points = (PixelPoint*)calloc(4, sizeof(PixelPoint)); 00235 PixelPoint* tempPoints = (PixelPoint*)calloc(2, sizeof(PixelPoint)); 00236 00237 params[0] = CameraParams(15.0, 0.0, 3.0, 90.0, -90.0, 0.465/2.54, 2.5); 00238 params[1] = CameraParams(5.5, 0.0, 3.0, 90.0, -90.0, 0.465/2.54, 2.5); 00239 params[2] = CameraParams(-5.5, 0.0, 3.0, 90.0, -90.0, 0.465/2.54, 2.5); 00240 params[3] = CameraParams(-15.0, 0.0, 3.0, 90.0, -90.0, 0.465/2.54, 2.5); 00241 00242 00243 points[0] = PixelPoint(0.0, 0.0); 00244 points[1] = PixelPoint(0.0, 0.0); 00245 points[2] = PixelPoint(0.0, 0.0); 00246 points[3] = PixelPoint(0.0, 0.0); 00247 // iteratively grab video from source and feed it into tracker 00248 overhead.resize(288,384); 00249 front.resize(288,288); 00250 00251 while(1) { 00252 tim.reset(); 00253 00254 00255 ima[0] = gb1->readRGB(); 00256 ima[1] = gb2->readRGB(); 00257 ima[2] = gb3->readRGB(); 00258 ima[3] = gb4->readRGB(); 00259 00260 uint64 t0 = tim.get(); // to measure display time 00261 00262 //display[0] = ima[0]; 00263 //display[1] = ima[1]; 00264 //display[2] = ima[2]; 00265 //display[3] = ima[3]; 00266 00267 // call tracker on images 00268 segmenter.trackImageMulti(&ima,4); 00269 00270 int modi[4],modj[4]; 00271 // get camera movement parameters from tracker 00272 for(int i = 0; i < 4; i++) 00273 { 00274 if(camPause[i].get() > delay[i]) 00275 { 00276 float doPan, doTilt; 00277 if(segmenter.returnLOT(i) == false) 00278 { 00279 segmenter.getImageTrackXY2(&modi[i],&modj[i],i); 00280 modi[i] = modi[i]*8; 00281 modj[i] = 480-modj[i]*8; 00282 // stereo stuff 00283 points[i].x = (modi[i]-320)*(4.6/(2.54*659)); 00284 points[i].y = (modj[i]-240)*(3.97/(2.54*494)); 00285 if(modi[i] > 0 && modi[i] < 640 && modj[i] > 0 && modj[i] < 480) 00286 { 00287 //std::cout << "doing Camera " << i << "\n"; 00288 if(i == 0) 00289 { 00290 delay[i] = camera1->moveCamXYFrame(modi[i],modj[i],i); 00291 if((delay[i] > 0) || (delay[i] == -5)) 00292 { 00293 camPause[i].reset(); 00294 doPan = camera1->getCurrentPan(); 00295 doTilt = camera1->getCurrentTilt(); 00296 segmenter.setCameraPosition(doPan,doTilt,i,true); 00297 } 00298 } 00299 if(i == 1) 00300 { 00301 delay[i] = camera2->moveCamXYFrame(modi[i],modj[i],i); 00302 if((delay[i] > 0) || (delay[i] == -5)) 00303 { 00304 camPause[i].reset(); 00305 doPan = camera2->getCurrentPan(); 00306 doTilt= camera2->getCurrentTilt(); 00307 segmenter.setCameraPosition(doPan,doTilt,i,true); 00308 } 00309 } 00310 if(i == 2) 00311 { 00312 delay[i] = camera3->moveCamXYFrame(modi[i],modj[i],i); 00313 if((delay[i] > 0) || (delay[i] == -5)) 00314 { 00315 camPause[i].reset(); 00316 doPan = camera3->getCurrentPan(); 00317 doTilt = camera3->getCurrentTilt(); 00318 segmenter.setCameraPosition(doPan,doTilt,i,true); 00319 } 00320 } 00321 if(i == 3) 00322 { 00323 00324 delay[i] = camera4->moveCamXYFrame(modi[i],modj[i],i); 00325 if((delay[i] > 0) || (delay[i] == -5)) 00326 { 00327 camPause[i].reset(); 00328 doPan = camera4->getCurrentPan(); 00329 doTilt = camera4->getCurrentTilt(); 00330 segmenter.setCameraPosition(doPan,doTilt,i,true); 00331 } 00332 } 00333 // stereo stuff 00334 params[i].theta = 180.0-doTilt; 00335 params[i].phi = -180.0+doPan; 00336 } 00337 } 00338 else 00339 { 00340 if(segmenter.doMoveCamera(i,&doPan,&doTilt) == true) 00341 { 00342 //LINFO("MOVING LOT camera %d to %f %f",i,doPan,doTilt); 00343 00344 if(i == 0) 00345 { 00346 delay[i] = camera1->moveCamTPFrame(doPan,doTilt,i); 00347 if(delay[i] > 0) 00348 { 00349 segmenter.setCameraPosition(doPan,doTilt,i,false); 00350 camPause[i].reset(); 00351 } 00352 } 00353 if(i == 1) 00354 { 00355 delay[i] = camera2->moveCamTPFrame(doPan,doTilt); 00356 if(delay[i] > 0) 00357 { 00358 segmenter.setCameraPosition(doPan,doTilt,i,false); 00359 camPause[i].reset(); 00360 } 00361 } 00362 if(i == 2) 00363 { 00364 delay[i] = camera3->moveCamTPFrame(doPan,doTilt); 00365 if(delay[i] > 0) 00366 { 00367 segmenter.setCameraPosition(doPan,doTilt,i,false); 00368 camPause[i].reset(); 00369 } 00370 } 00371 if(i == 3) 00372 { 00373 delay[i] = camera4->moveCamTPFrame(doPan,doTilt); 00374 if(delay[i] > 0) 00375 { 00376 segmenter.setCameraPosition(doPan,doTilt,i,false); 00377 camPause[i].reset(); 00378 } 00379 } 00380 } 00381 } 00382 } 00383 } 00384 00385 // END 00386 00387 // draw all our X window displays 00388 00389 int highest = 0; 00390 int nextHighest = 1; 00391 int colorSetR[4]; 00392 int colorSetB[4]; 00393 for(int i = 0; i < 4; i++) 00394 { 00395 colorSetR[i] = 0; 00396 colorSetB[i] = 255; 00397 00398 float p = segmenter.returnCameraProb(i); 00399 LINFO("CAMERA %d is P %f",i,p); 00400 bool high = true; 00401 bool nextHigh = false; 00402 bool stop = false; 00403 for(int j = 0; j < 4; j++) 00404 { 00405 if(j != i) 00406 { 00407 if(p < segmenter.returnCameraProb(j)) 00408 { 00409 //LINFO("%f is LT %f",p, segmenter.returnCameraProb(j)); 00410 high = false; 00411 if((nextHigh == false) && (stop == false)) 00412 { 00413 nextHigh = true; 00414 stop = true; 00415 } 00416 else 00417 { 00418 //LINFO("NEXTHIGHEST FALSE"); 00419 nextHigh = false; 00420 } 00421 } 00422 } 00423 } 00424 if(high == true) 00425 { 00426 highest = i; 00427 } 00428 if(nextHigh == true) 00429 { 00430 nextHighest = i; 00431 } 00432 } 00433 colorSetR[highest] = 255; 00434 colorSetB[highest] = 0; 00435 colorSetR[nextHighest] = 255; 00436 colorSetB[nextHighest] = 0; 00437 00438 LINFO("HIGHEST %d NEXT HIGHEST %d",highest,nextHighest); 00439 //if((segmenter.returnLOT(highest) == false) && (segmenter.returnLOT(nextHighest) == false)) 00440 //{ 00441 Point3D retPoint = Point3D(0.0, 0.0, 0.0); 00442 tempParams[0] = params[0]; 00443 tempParams[1] = params[1]; 00444 tempPoints[0] = points[0]; 00445 tempPoints[1] = points[1]; 00446 bool retVal = segmenter.StereoMatch(tempPoints, tempParams, &retPoint); 00447 00448 //printf("###############################################################\n"); 00449 00450 // printf("%f %f\n", tempPoints[0].x, tempPoints[0].y); 00451 // printf("%f %f %f %f %f %f %f\n", tempParams[0].x, tempParams[0].y, tempParams[0].z, 00452 // tempParams[0].theta, tempParams[0].phi, tempParams[0].f, tempParams[0].r); 00453 // 00454 // printf("%f %f\n", tempPoints[1].x, tempPoints[1].y); 00455 // printf("%f %f %f %f %f %f %f\n", tempParams[1].x, tempParams[1].y, tempParams[1].z, 00456 // tempParams[1].theta, tempParams[1].phi, tempParams[1].f, tempParams[1].r); 00457 if(retVal) 00458 { 00459 overhead.resize(400,400,true); 00460 front.resize(400,400,true); 00461 drawGrid(overhead, 96,96,1,1,PixRGB<byte>(150,150,150)); 00462 drawGrid(front, 96,96,1,1,PixRGB<byte>(150,150,150)); 00463 00464 drawCircle(overhead, Point2D<int>(140,200) 00465 ,2,PixRGB<byte>(colorSetR[0],0,colorSetB[0]),3); 00466 drawCircle(overhead, Point2D<int>(180,200) 00467 ,2,PixRGB<byte>(colorSetR[1],0,colorSetB[1]),3); 00468 drawCircle(overhead, Point2D<int>(220,200) 00469 ,2,PixRGB<byte>(colorSetR[2],0,colorSetB[2]),3); 00470 drawCircle(overhead, Point2D<int>(260,200) 00471 ,2,PixRGB<byte>(colorSetR[3],0,colorSetB[3]),3); 00472 00473 drawCircle(overhead, Point2D<int>(200,220) 00474 ,2,PixRGB<byte>(0,255,255),3); 00475 float pointX = 200-(4*retPoint.x); 00476 float pointY = 200-(4*(-1*retPoint.y)); 00477 00478 //std::cout << "pointX " << pointX << " pointY " << pointY << "\n"; 00479 if(((pointX < 400) && (pointX > 0)) && ((pointY < 400) && (pointY > 0))) 00480 { 00481 printf("x=%f y=%f z=%f\n", retPoint.x, retPoint.y, retPoint.z); 00482 drawCircle(overhead, Point2D<int>((int)pointX,(int)pointY) 00483 ,2,PixRGB<byte>(255,0,0),2); 00484 } 00485 } 00486 else 00487 printf("Not Admissible\n"); 00488 //} 00489 //printf("###############################################################\n"); 00490 00491 wini1.drawImage(ima[0]); 00492 wini2.drawImage(ima[1]); 00493 wini3.drawImage(ima[2]); 00494 wini4.drawImage(ima[3]); 00495 roomOver.drawImage(overhead); 00496 roomFront.drawImage(front); 00497 00498 00499 t[frame % NAVG] = tim.get(); 00500 t0 = t[frame % NAVG] - t0; 00501 if (t0 > 28) LINFO("Display took %llums", t0); 00502 00503 // compute and show framerate over the last NAVG frames: 00504 if (frame % NAVG == 0 && frame > 0) 00505 { 00506 uint64 avg = 0; for (int i = 0; i < NAVG; i ++) avg += t[i]; 00507 float avg2 = 1000.0 / (float)avg * NAVG; 00508 printf("Framerate: %.1f fps\n", avg2); 00509 } 00510 frame ++; 00511 } 00512 00513 manager.stop(); 00514 return 0; 00515 } 00516 00517 // ###################################################################### 00518 /* So things look consistent in everyone's emacs... */ 00519 /* Local Variables: */ 00520 /* indent-tabs-mode: nil */ 00521 /* End: */