00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
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
00049 #include <cstdio>
00050 #include <cstdlib>
00051 #include <iostream>
00052
00053
00054 #define NAVG 20
00055
00056 int main(const int argc, const char **argv)
00057 {
00058
00059
00060 ModelManager manager("Multi Frame Grabber Tester");
00061 manager.allowOptions(OPTEXP_NONE);
00062
00063
00064
00065 nub::soft_ref<FrameIstream> gb1(makeIEEE1394grabber(manager));
00066 gb1->setModelParamVal("FrameGrabberSubChan", 0);
00067
00068
00069
00070 nub::soft_ref<FrameIstream> gb2(makeIEEE1394grabber(manager));
00071 gb2->setModelParamVal("FrameGrabberSubChan", 1);
00072
00073
00074
00075 nub::soft_ref<FrameIstream> gb3(makeIEEE1394grabber(manager));
00076 gb3->setModelParamVal("FrameGrabberSubChan", 2);
00077
00078
00079 nub::soft_ref<FrameIstream> gb4(makeIEEE1394grabber(manager));
00080 gb4->setModelParamVal("FrameGrabberSubChan", 3);
00081
00082
00083
00084
00085 manager.addSubComponent(gb1);
00086 manager.addSubComponent(gb2);
00087 manager.addSubComponent(gb3);
00088 manager.addSubComponent(gb4);
00089
00090
00091
00092
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
00119 if (manager.parseCommandLine(argc, argv, "", 0, 0) == false) return(1);
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
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
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];
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
00168 segmentImageMerge segmenter(4);
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
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
00184
00185
00186
00187
00188
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
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
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
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
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
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
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();
00261
00262
00263
00264
00265
00266
00267
00268 segmenter.trackImageMulti(&ima,4);
00269
00270 int modi[4],modj[4];
00271
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
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
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
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
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
00386
00387
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
00410 high = false;
00411 if((nextHigh == false) && (stop == false))
00412 {
00413 nextHigh = true;
00414 stop = true;
00415 }
00416 else
00417 {
00418
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
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
00449
00450
00451
00452
00453
00454
00455
00456
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
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
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
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
00519
00520
00521