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 #include "Media/SceneGenerator.H"
00039 #include "Raster/Raster.H"
00040 #include "Image/CutPaste.H"
00041 #include "Image/ShapeOps.H"
00042 #include "Image/DrawOps.H"
00043 #include "Util/FileUtil.H"
00044
00045 #include <dirent.h>
00046
00047 #include "GUI/XWinManaged.H"
00048 #include "GUI/DebugWin.H"
00049
00050 #include <vector>
00051
00052
00053 SceneGenerator::SceneGenerator(SceneType sceneType, int width, int height) :
00054 itsSceneType(sceneType), itsWidth(width), itsHeight(height),
00055 itsALOIImages(NULL),
00056 itsCoilImages(NULL),
00057 itsTestImages(NULL),
00058 itsTargetsLoc(0),
00059 itsObjLocation(),
00060 itsTargetObject(-1),
00061 itsObjectSize(80),
00062 itsTargetColor(PixRGB<byte>(0,0,0)),
00063 itsLum(-1),
00064 itsRot(-1),
00065 itsColor(-1),
00066 itsNoise(-1),
00067 itsBackgroundColor(PixRGB<byte>(0,0,0))
00068 {
00069
00070 initRandomNumbers();
00071
00072 setSceneType(sceneType);
00073 }
00074
00075
00076 SceneGenerator::~SceneGenerator()
00077 {
00078 if (itsALOIImages != NULL)
00079 delete itsALOIImages;
00080
00081 if (itsCoilImages != NULL)
00082 delete itsCoilImages;
00083
00084 if (itsTestImages != NULL)
00085 delete itsTestImages;
00086
00087 }
00088
00089 void SceneGenerator::setSceneType(SceneType sceneId)
00090 {
00091
00092 itsSceneType = sceneId;
00093
00094
00095 switch(itsSceneType)
00096 {
00097 case SIMPLE_EDGES:
00098 itsBackgroundColor = PixRGB<byte>(0,0,0);
00099 break;
00100 case SIMPLE_SHAPES:
00101 itsBackgroundColor = PixRGB<byte>(0,0,0);
00102 itsTargetColor = PixRGB<byte>(100, 100, 100);
00103 itsColor = PixRGB<byte>(200, 200, 200);
00104 itsTargetObject = 0;
00105 itsNoise = 30;
00106 break;
00107 case ALOI_OBJECTS:
00108 if (itsALOIImages == NULL)
00109 itsALOIImages = new TestImages("/lab/ilab15/tmp/objectsDB/png/png",
00110 TestImages::ALOI);
00111 itsBackgroundColor = PixRGB<byte>(15, 15, 8);
00112 itsTargetObject = 0;
00113 break;
00114 case COIL_OBJECTS:
00115 if (itsCoilImages == NULL)
00116 itsCoilImages = new TestImages("/lab/ilab15/tmp/objectsDB/coil/coil-100",
00117 TestImages::COIL);
00118 itsBackgroundColor = PixRGB<byte>(15, 15, 8);
00119 itsTargetObject = 0;
00120 break;
00121 case SATELLITE_KATRINA:
00122 readDirScenes("/lab/lior/images/croped");
00123 break;
00124 case MIT_LABELME:
00125 if (itsTestImages != NULL) delete itsTestImages;
00126 readDirScenes("/lab/ilab15/tmp/objectsDB/mit/labelMe");
00127 break;
00128
00129
00130 }
00131
00132
00133 }
00134
00135
00136 void SceneGenerator::readDirScenes(const char *path)
00137 {
00138
00139 DIR *dp = opendir(path);
00140 dirent *dirp;
00141 while ((dirp = readdir(dp)) != NULL ) {
00142 switch(itsSceneType)
00143 {
00144 case SATELLITE_KATRINA:
00145 if (dirp->d_name[0] != '.')
00146 sceneFilenames.push_back(std::string(path) + '/' + std::string(dirp->d_name));
00147 break;
00148
00149 case MIT_LABELME:
00150
00151 if (dirp->d_name[0] != '.' &&
00152 isDirectory(dirp))
00153 sceneFilenames.push_back(std::string(path) + '/' + std::string(dirp->d_name));
00154 break;
00155 default:
00156 break;
00157 }
00158
00159 }
00160 LINFO("%"ZU" files in the directory\n", sceneFilenames.size());
00161
00162 }
00163
00164
00165 void SceneGenerator::setTargetObject(int obj)
00166 {
00167 itsTargetObject = obj;
00168 }
00169
00170
00171 Image<PixRGB<byte> > SceneGenerator::getScene(int nobj, int lum, int col, int rot)
00172 {
00173 switch(itsSceneType)
00174 {
00175 case SIMPLE_EDGES:
00176 break;
00177 case SIMPLE_SHAPES:
00178 return generateShapeScene();
00179 break;
00180 case ALOI_OBJECTS:
00181 return generateAloiObjectsScene(nobj, lum, col, rot);
00182 break;
00183 case COIL_OBJECTS:
00184 return generateCoilObjectsScene(nobj);
00185 break;
00186 case SATELLITE_KATRINA:
00187 return getSceneFile();
00188 case MIT_LABELME:
00189 return getLabelMeScene();
00190 break;
00191 }
00192
00193 return Image<PixRGB<byte> >();
00194
00195 }
00196
00197
00198 Image<PixRGB<byte> > SceneGenerator::getSceneFile()
00199 {
00200
00201 static int index = 0;
00202
00203 index++;
00204 index = index % sceneFilenames.size();
00205
00206 return Raster::ReadRGB(sceneFilenames[index]);
00207 }
00208
00209
00210
00211 Image<PixRGB<byte> > SceneGenerator::getLabelMeScene()
00212 {
00213
00214 static int index = 0;
00215
00216 index++;
00217 index = index % sceneFilenames.size();
00218
00219 if (itsTestImages != NULL) delete itsTestImages;
00220 itsTestImages = new TestImages(sceneFilenames[index].c_str(),
00221 TestImages::MIT_LABELME);
00222
00223 Image<PixRGB<byte> > scene = itsTestImages->getScene(0);
00224
00225
00226 scene = rescale(scene, itsWidth, itsHeight);
00227 return scene;
00228 }
00229
00230
00231 Image<PixRGB<byte> > SceneGenerator::generateEdgeScene()
00232 {
00233
00234
00235 return Image<PixRGB<byte> >();
00236 }
00237
00238
00239 Image<PixRGB<byte> > SceneGenerator::generateShapeScene()
00240 {
00241
00242 Image<PixRGB<byte> > sceneImg(itsWidth, itsHeight, NO_INIT);
00243 sceneImg.clear(itsBackgroundColor);
00244
00245 itsTargetsLoc.clear();
00246
00247 PixRGB<byte> color;
00248
00249 int idx = 0; int targetObjPos = randomUpToIncluding(8);
00250 for (int y=itsObjectSize+10; y<sceneImg.getHeight(); y += (itsObjectSize * 2))
00251 for(int x=itsObjectSize+10; x<sceneImg.getWidth(); x += (itsObjectSize * 2))
00252 {
00253 int objType = randomUpToIncluding(0);
00254
00255
00256
00257
00258 if (idx == targetObjPos)
00259 {
00260 itsTargetsLoc.push_back(Point2D<int>(x,y));
00261 objType = itsTargetObject;
00262 color = itsTargetColor;
00263
00264 } else {
00265 color = itsColor;
00266 }
00267
00268 int noise = randomUpToIncluding(itsNoise*2)-itsNoise;
00269 color[0] += noise;
00270 color[1] += noise;
00271 color[2] += noise;
00272
00273
00274 switch(objType)
00275 {
00276 case 0:
00277 drawDisk(sceneImg, Point2D<int>(x, y), itsObjectSize/2, color);
00278 break;
00279 case 1:
00280 drawCross(sceneImg, Point2D<int>(x, y), color, itsObjectSize/2);
00281 break;
00282 case 2:
00283 drawRectOR(sceneImg, Rectangle::tlbrI(y-(itsObjectSize/2),
00284 x-(itsObjectSize/2),
00285 y+(itsObjectSize/2),
00286 x+(itsObjectSize/2)),
00287 color, 1, M_PI/2);
00288 break;
00289 case 3:
00290 drawRectOR(sceneImg, Rectangle::tlbrI(y-(itsObjectSize/2),
00291 x-(itsObjectSize/2),
00292 y+(itsObjectSize/2),
00293 x+(itsObjectSize/2)),
00294 color);
00295 break;
00296 case 4:
00297 drawPatch(sceneImg, Point2D<int>(x, y), itsObjectSize/2, color);
00298 break;
00299 }
00300
00301 idx++;
00302 }
00303
00304 return sceneImg;
00305 }
00306
00307
00308 Image<PixRGB<byte> > SceneGenerator::generateAloiObjectsScene(int nobj, int lum, int col, int rot)
00309 {
00310
00311 Image<PixRGB<byte> > sceneImg(itsWidth, itsHeight, NO_INIT);
00312 sceneImg.clear(itsBackgroundColor);
00313
00314 itsTargetsLoc.clear();
00315 itsObjLocation.clear();
00316
00317 int idx = 0; int targetObjPos = -1;
00318
00319
00320
00321
00322
00323
00324
00325
00326 std::vector<int> objInScene;
00327
00328 int objType = 0;
00329 for (int y=itsObjectSize+10; y<sceneImg.getHeight(); y += (itsObjectSize * 2))
00330 for(int x=itsObjectSize+10; x<sceneImg.getWidth(); x += (itsObjectSize * 2))
00331 {
00332 bool exsist = true;
00333
00334 while(exsist)
00335 {
00336 objType = randomUpToIncluding(nobj-1);
00337 exsist = false;
00338 for(uint i=0; i<objInScene.size(); i++)
00339 {
00340 if (objType == objInScene[i])
00341 {
00342 exsist = true;
00343 }
00344 }
00345 }
00346
00347 objInScene.push_back(objType);
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 Image<PixRGB<byte> > obj;
00361 if (idx == targetObjPos || objType == itsTargetObject)
00362 {
00363 itsTargetsLoc.push_back(Point2D<int>(x,y));
00364 itsObjLocation.push_back(ObjectInfo(Point2D<int>(x,y), itsTargetObject));
00365 obj = itsALOIImages->getObject(itsTargetObject, lum, col, rot);
00366 } else {
00367 itsObjLocation.push_back(ObjectInfo(Point2D<int>(x,y), objType));
00368 obj = itsALOIImages->getObject(objType, lum, col, rot);
00369 }
00370
00371 obj = rescale(obj, itsObjectSize, itsObjectSize);
00372 inplacePaste(sceneImg, obj, Point2D<int>(x-itsObjectSize/2, y-itsObjectSize/2));
00373 idx++;
00374 }
00375
00376
00377
00378 return sceneImg;
00379
00380
00381 }
00382
00383
00384 Image<PixRGB<byte> > SceneGenerator::generateCoilObjectsScene(int nobj)
00385 {
00386
00387 Image<PixRGB<byte> > sceneImg(itsWidth, itsHeight, NO_INIT);
00388 sceneImg.clear(itsBackgroundColor);
00389
00390 itsTargetsLoc.clear();
00391
00392 int idx = 0; int targetObjPos = randomUpToIncluding(8);
00393 int lum = -2, col = -2, rot = -2;
00394 for (int y=itsObjectSize+10; y<sceneImg.getHeight(); y += (itsObjectSize * 2))
00395 for(int x=itsObjectSize+10; x<sceneImg.getWidth(); x += (itsObjectSize * 2))
00396 {
00397 int objType = randomUpToIncluding(98) + 1;
00398
00399 if(itsColor[1] == 0)
00400 rot = randomUpToIncluding(71) + 1;
00401
00402 Image<PixRGB<byte> > obj;
00403 if (idx == targetObjPos || objType == itsTargetObject)
00404 {
00405 itsTargetsLoc.push_back(Point2D<int>(x,y));
00406 obj = itsCoilImages->getObject(itsTargetObject, lum, col, rot);
00407 } else {
00408 obj = itsCoilImages->getObject(objType, lum, col, rot);
00409 }
00410
00411 obj = rescale(obj, itsObjectSize, itsObjectSize);
00412 inplacePaste(sceneImg, obj, Point2D<int>(x-itsObjectSize/2, y-itsObjectSize/2));
00413 idx++;
00414 }
00415
00416 return sceneImg;
00417
00418
00419 }
00420
00421 bool SceneGenerator::checkTargetPos(const Point2D<int> &pt, const Dims &searchWin)
00422 {
00423 int x = pt.i;
00424 int y = pt.j;
00425 bool foundTarget = false;
00426 for(uint i=0; i<itsTargetsLoc.size(); i++){
00427 if (itsTargetsLoc[i].i > x - (searchWin.w()/2) &&
00428 itsTargetsLoc[i].i < x + (searchWin.w()/2) &&
00429 itsTargetsLoc[i].j > y - (searchWin.h()/2) &&
00430 itsTargetsLoc[i].j < y + (searchWin.h()/2) ){
00431 LINFO("Object found at %ix%i T%i at %ix%i",
00432 x, y, i, itsTargetsLoc[i].i, itsTargetsLoc[i].j);
00433 foundTarget = true;
00434 break;
00435 }
00436 }
00437
00438 return foundTarget;
00439
00440 }
00441
00442
00443 int SceneGenerator::getObjFromPos(const Point2D<int> &pt, const Dims &searchWin)
00444 {
00445 int x = pt.i;
00446 int y = pt.j;
00447 int objId = -1;
00448 for(uint i=0; i<itsObjLocation.size(); i++){
00449 if (itsObjLocation[i].loc.i > x - (searchWin.w()/2) &&
00450 itsObjLocation[i].loc.i < x + (searchWin.w()/2) &&
00451 itsObjLocation[i].loc.j > y - (searchWin.h()/2) &&
00452 itsObjLocation[i].loc.j < y + (searchWin.h()/2) ){
00453 objId = itsObjLocation[i].objId;
00454 break;
00455 }
00456 }
00457
00458 return objId;
00459
00460 }
00461
00462
00463 Point2D<int> SceneGenerator::getObjLocation(uint objId)
00464 {
00465 ASSERT(objId < itsObjLocation.size());
00466 return itsObjLocation[objId].loc;
00467
00468 }
00469
00470
00471 int SceneGenerator::getObjId(uint objId)
00472 {
00473 ASSERT(objId < itsObjLocation.size());
00474 return itsObjLocation[objId].objId;
00475
00476 }
00477
00478
00479 uint SceneGenerator::getNumObj()
00480 {
00481 return itsObjLocation.size();
00482 }
00483
00484
00485 const Point2D<int> SceneGenerator::getTargetPos() const
00486 {
00487
00488 if (itsTargetsLoc.size() > 0)
00489 return itsTargetsLoc[0];
00490 else
00491 return Point2D<int>();
00492 };
00493
00494
00495 void SceneGenerator::setObjectSize(int size)
00496 {
00497 itsObjectSize = size;
00498 }
00499
00500
00501
00502 void SceneGenerator::setTargetColor(PixRGB<byte> color)
00503 {
00504 itsTargetColor = color;
00505 }
00506
00507
00508 void SceneGenerator::setLum(int lum)
00509 {
00510 itsLum = lum;
00511 }
00512
00513
00514 void SceneGenerator::setRotation(int rot)
00515 {
00516 itsRot = rot;
00517 }
00518
00519
00520 void SceneGenerator::setColor(PixRGB<byte> color)
00521 {
00522 itsColor = color;
00523 }
00524
00525
00526 void SceneGenerator::setNoise(int level)
00527 {
00528 itsNoise = level;
00529 }
00530
00531
00532 void SceneGenerator::setBackgroundColor(PixRGB<byte> color)
00533 {
00534 itsBackgroundColor = color;
00535 }
00536
00537
00538 int SceneGenerator::getObjectSize()
00539 {
00540 return itsObjectSize;
00541 }
00542
00543 int SceneGenerator::getTargetObject()
00544 {
00545 return itsTargetObject;
00546 }
00547
00548
00549 PixRGB<byte> SceneGenerator::getTargetColor()
00550 {
00551 return itsTargetColor;
00552 }
00553
00554
00555 int SceneGenerator::getLum()
00556 {
00557 return itsLum;
00558 }
00559
00560
00561 int SceneGenerator::getRotation()
00562 {
00563 return itsRot;
00564 }
00565
00566
00567 PixRGB<byte> SceneGenerator::getColor()
00568 {
00569 return itsColor;
00570 }
00571
00572
00573 int SceneGenerator::getNoise()
00574 {
00575 return itsNoise;
00576 }
00577
00578
00579 PixRGB<byte> SceneGenerator::getBackgroundColor()
00580 {
00581 return itsBackgroundColor;
00582 }
00583
00584 SceneGenerator::SceneType SceneGenerator::getSceneType()
00585 {
00586 return itsSceneType;
00587 }
00588
00589 uint SceneGenerator::getNumSceneTypes()
00590 {
00591 return numSceneTypeNames;
00592 }
00593
00594
00595
00596
00597
00598