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 #ifndef BEOBOT_LANDMARK_DEFINED
00039 #define BEOBOT_LANDMARK_DEFINED
00040
00041 #include "SIFT/VisualObjectDB.H"
00042 #include "GUI/XWinManaged.H"
00043 #include "Beobot/KeypointTracker.H"
00044 #include "SIFT/CameraIntrinsicParam.H"
00045
00046
00047
00048
00049
00050
00051 class Landmark
00052 {
00053 public:
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 Landmark(rutz::shared_ptr<VisualObject>& obj,
00066 Point2D<int> objOffset,
00067 uint fNum,
00068 const std::string& name = "");
00069
00070
00071 Landmark(const std::string& name = "");
00072
00073
00074 void init(rutz::shared_ptr<VisualObject>& obj,
00075 Point2D<int> objOffset, uint fNum);
00076
00077
00078 bool loadFrom(const std::string& fname);
00079
00080
00081 bool saveTo(const std::string& fname);
00082
00083
00084 ~Landmark();
00085
00086
00087
00088
00089
00090
00091
00092
00093 inline const std::string& getName() const;
00094
00095
00096 inline void setName(const std::string name);
00097
00098
00099 inline void setMatchWin(rutz::shared_ptr<XWinManaged> matchWin);
00100
00101
00102 inline rutz::shared_ptr<XWinManaged> getMatchWin();
00103
00104
00105 inline const uint numObjects() const;
00106
00107
00108 inline const uint numTempObjects() const;
00109
00110
00111 inline const uint getLatestVisualObjectFNum() const;
00112
00113
00114 inline const uint getLatestTempVisualObjectFNum() const;
00115
00116
00117 inline const uint getLatestFNum() const;
00118
00119
00120 inline const Point2D<int> getLatestOffsetCoords() const;
00121
00122
00123 inline const rutz::shared_ptr<VisualObject>&
00124 getLatestObject(bool& indb, bool& intdb, int& tindex) const;
00125
00126
00127 inline const rutz::shared_ptr<VisualObject>&
00128 getObject(const uint index) const;
00129
00130
00131 inline const uint getVisualObjectFNum(uint index) const;
00132
00133
00134 inline const Point2D<int> getOffsetCoords(uint index) const;
00135
00136
00137 inline const bool isVisualObjectSal(uint index) const;
00138
00139
00140 inline const rutz::shared_ptr<VisualObject>&
00141 getTempObject(const uint index) const;
00142
00143
00144 inline const uint getTempVisualObjectFNum(uint index) const;
00145
00146
00147 inline const Point2D<int> getTempOffsetCoords(uint index) const;
00148
00149
00150 inline rutz::shared_ptr<VisualObjectDB> getVisualObjectDB() const;
00151
00152
00153 Rectangle getObjectRect(uint index);
00154
00155
00156 inline bool haveSessionVO(std::string session);
00157
00158
00159 inline uint getNumSession();
00160
00161
00162 inline std::string getSession(const uint index);
00163
00164
00165 inline std::pair<uint,uint> getSessionIndexRange(const uint index);
00166
00167
00168
00169
00170
00171
00172
00173 inline const bool isSalVisualObject(uint index) const;
00174
00175
00176 rutz::shared_ptr<VisualObjectMatch>
00177 build(rutz::shared_ptr<VisualObject> obj,
00178 Point2D<int> objOffset, uint fNum);
00179
00180
00181
00182 rutz::shared_ptr<VisualObjectMatch>
00183 build(rutz::shared_ptr<VisualObject> obj, uint fNum);
00184
00185
00186
00187
00188 rutz::shared_ptr<VisualObjectMatch>
00189 buildCheck(rutz::shared_ptr<VisualObject> obj,
00190 Point2D<int> objOffset, uint fNum,
00191 bool &inDB, bool &inTDB, int &tIndex);
00192
00193
00194 rutz::shared_ptr<VisualObjectMatch>
00195 buildCheck(rutz::shared_ptr<VisualObject> obj, uint fNum,
00196 bool &inDB, bool &inTDB, int &tIndex);
00197
00198
00199
00200 rutz::shared_ptr<VisualObjectMatch>
00201 build(rutz::shared_ptr<VisualObject> obj,
00202 Point2D<int> objOffset, uint fNum,
00203 bool inDB, bool inTDB, int tIndex,
00204 rutz::shared_ptr<VisualObjectMatch> cmatch);
00205
00206
00207
00208 rutz::shared_ptr<VisualObjectMatch>
00209 build(rutz::shared_ptr<VisualObject> obj, uint fNum,
00210 bool inDB, bool inTDB, int tIndex,
00211 rutz::shared_ptr<VisualObjectMatch> cmatch);
00212
00213
00214 Point2D<int> getVelocity();
00215
00216
00217
00218 Point2D<int> getPosition();
00219
00220
00221
00222 std::vector<rutz::shared_ptr<Keypoint> > getActiveKeypoints();
00223
00224
00225 rutz::shared_ptr<KeypointTracker> getFittestKPtr();
00226
00227
00228 inline void setCameraIntrinsicParam
00229 (rutz::shared_ptr<CameraIntrinsicParam> cip);
00230
00231
00232 void moveLatestTempVisualObjectToDB();
00233
00234
00235 uint numMatch(rutz::shared_ptr<Landmark> lmk,
00236 float maxPixDist = 10.0F, float minfsim = .75F,
00237 float minscore = 2.5F, uint minmatch = 4);
00238
00239
00240 void combine(rutz::shared_ptr<Landmark> lmk1,
00241 rutz::shared_ptr<Landmark> lmk2);
00242
00243
00244 void append(rutz::shared_ptr<Landmark> lmk);
00245
00246
00247 int match(rutz::shared_ptr<VisualObject> obj,
00248 rutz::shared_ptr<VisualObjectMatch> &cmatch,
00249 int start = -1, int end = -1,
00250 float maxPixDist = 10.0F,
00251 float minfsim = .75F,
00252 float minscore = 2.5F,
00253 uint minmatch = 4,
00254 float maxRotate = M_PI/4,
00255 float maxScale = 5.0F,
00256 float maxShear = 0.25F);
00257
00258
00259 void transferEvidence
00260 ( rutz::shared_ptr<Landmark> landmark2,
00261 bool indb2, bool intdb2, int tIndex2,
00262 rutz::shared_ptr<VisualObjectMatch> cmatch);
00263
00264
00265
00266 float matchSalientFeatures(rutz::shared_ptr<VisualObject> object);
00267
00268
00269 void sort(std::vector<std::string> sessionNames);
00270
00271
00272 void setSessionInfo();
00273
00274
00275
00276 private:
00277
00278
00279 std::string itsName;
00280
00281
00282 rutz::shared_ptr<XWinManaged> itsMatchWin;
00283
00284
00285 rutz::shared_ptr<VisualObjectMatchAlgo> itsVoma;
00286
00287
00288 rutz::shared_ptr<VisualObjectDB> itsVisualObjectDB;
00289
00290
00291 std::vector<Point2D<int> > itsOffsetCoords;
00292
00293
00294 std::vector<uint> itsVisualObjectFNum;
00295
00296
00297
00298 rutz::shared_ptr<VisualObjectDB> itsTempVisualObjectDB;
00299
00300
00301 std::vector<Point2D<int> > itsTempOffsetCoords;
00302
00303
00304 std::vector<uint> itsTempVisualObjectFNum;
00305
00306
00307
00308 std::vector<rutz::shared_ptr<KeypointTracker> > itsKPtrackers;
00309
00310
00311 rutz::shared_ptr<CameraIntrinsicParam> itsCip;
00312
00313
00314 uint itsLatestVisualObjectFNum;
00315
00316
00317 uint itsLatestTempVisualObjectFNum;
00318
00319
00320
00321
00322 std::vector<std::pair<double,double> > itsSalientFeatures;
00323
00324
00325 std::vector<std::string> itsSession;
00326 std::vector<std::pair<uint,uint> > itsSessionIndexRange;
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340 rutz::shared_ptr<VisualObjectMatch>
00341 match(rutz::shared_ptr<VisualObject> a,
00342 rutz::shared_ptr<VisualObject> b, bool &isFit,
00343 float maxPixDist = 10.0F,
00344 float minfsim = .75F,
00345 float minscore = 2.5F,
00346 uint minmatch = 4,
00347 float maxRotate = M_PI/4,
00348 float maxScale = 5.0F,
00349 float maxShear = 0.25F,
00350 bool showMatch = false);
00351
00352
00353 rutz::shared_ptr<VisualObjectMatch>
00354 input(rutz::shared_ptr<VisualObject> obj,
00355 Point2D<int> objOffset, uint fNum);
00356
00357
00358 rutz::shared_ptr<VisualObjectMatch>
00359 inputCheck(rutz::shared_ptr<VisualObject> obj,
00360 Point2D<int> objOffset, uint fNum,
00361 bool &inDB, bool &inTDB, int &tIndex);
00362
00363
00364
00365 rutz::shared_ptr<VisualObjectMatch>
00366 input(rutz::shared_ptr<VisualObject> obj,
00367 Point2D<int> objOffset, uint fNum,
00368 bool inDB, bool inTDB, int tIndex,
00369 rutz::shared_ptr<VisualObjectMatch> cmatch);
00370
00371
00372
00373 rutz::shared_ptr<VisualObjectMatch>
00374 cropInputImage(rutz::shared_ptr<VisualObject> &obj, Point2D<int> &objOffset,
00375 int mInd, rutz::shared_ptr<VisualObjectMatch> cmatch);
00376
00377
00378 void trackKeypoints(rutz::shared_ptr<VisualObjectMatch> match, int mInd);
00379
00380
00381 void temporalPrune(uint index);
00382
00383
00384 int getFNumIndex(uint fNum);
00385
00386
00387 void addObject(rutz::shared_ptr<VisualObject> obj,
00388 Point2D<int> objOffset, uint fNum);
00389
00390
00391 void tAddObject(rutz::shared_ptr<VisualObject> obj,
00392 Point2D<int> objOffset, uint fNum);
00393
00394
00395 int findDBmatch(rutz::shared_ptr<VisualObject> obj,
00396 rutz::shared_ptr<VisualObjectMatch> &cmatch,
00397 uint nFrames,
00398 bool isForward = false, int start = -1,
00399 float maxPixDist = 10.0F, float minfsim = .75F,
00400 float minscore = 2.5F, uint minmatch = 4,
00401 float maxRotate = M_PI/4,
00402 float maxScale = 5.0F,
00403 float maxShear = 0.25F);
00404
00405
00406 int findTempDBmatch(rutz::shared_ptr<VisualObject> obj,
00407 rutz::shared_ptr<VisualObjectMatch> &cmatch,
00408 uint nFrames,
00409 float maxPixDist = 10.0F, float minfsim = .75F,
00410 float minscore = 2.5F, uint minmatch = 4);
00411
00412
00413
00414 void moveTempVisualObjectToDB(int index);
00415
00416
00417 void cleanDelete(bool indb, bool intdb, int tIndex);
00418
00419
00420 inline void eraseObject(const uint index);
00421
00422
00423 inline void eraseTempObject(const uint index);
00424
00425
00426 inline void eraseOffsetCoords(const uint index);
00427
00428
00429 inline void eraseTempOffsetCoords(const uint index);
00430
00431
00432 inline void eraseVisualObjectFNum(const uint index);
00433
00434
00435 inline void eraseTempVisualObjectFNum(const uint index);
00436
00437
00438 void computeSalientFeatures();
00439
00440
00441 };
00442
00443
00444
00445
00446 inline const std::string& Landmark::getName() const
00447 { return itsName; }
00448
00449 inline void Landmark::setName(const std::string name)
00450 { itsName = name; }
00451
00452 inline void Landmark::setMatchWin(rutz::shared_ptr<XWinManaged> matchWin)
00453 { itsMatchWin = matchWin; }
00454
00455 inline rutz::shared_ptr<XWinManaged> Landmark::getMatchWin()
00456 { return itsMatchWin; }
00457
00458 inline const uint Landmark::numObjects() const
00459 { return itsVisualObjectDB->numObjects(); }
00460
00461 inline const uint Landmark::numTempObjects() const
00462 { return itsTempVisualObjectDB->numObjects(); }
00463
00464 inline const uint Landmark::getLatestVisualObjectFNum() const
00465 { return itsLatestVisualObjectFNum; }
00466
00467 inline const uint Landmark::getLatestTempVisualObjectFNum() const
00468 { return itsLatestTempVisualObjectFNum; }
00469
00470 inline const uint Landmark::getLatestFNum() const
00471 {
00472 if(itsLatestVisualObjectFNum > itsLatestTempVisualObjectFNum)
00473 return itsLatestVisualObjectFNum;
00474 else
00475 return itsLatestTempVisualObjectFNum;
00476 }
00477
00478 inline const rutz::shared_ptr<VisualObject>&
00479 Landmark::getLatestObject(bool &indb, bool &intdb, int &tindex) const
00480 {
00481 if(itsLatestVisualObjectFNum >= itsLatestTempVisualObjectFNum)
00482 {
00483 indb = true;
00484 intdb = false;
00485 for(int i = numObjects()-1; i >= 0; i--)
00486 {
00487 if(itsVisualObjectFNum[i] == itsLatestVisualObjectFNum)
00488 {
00489 tindex = i;
00490 return itsVisualObjectDB->getObject(i);
00491 }
00492 }
00493 }
00494 else
00495 {
00496 indb = false;
00497 intdb = true;
00498 for(int i = numTempObjects()-1; i >= 0; i--)
00499 {
00500 if(itsTempVisualObjectFNum[i] == itsLatestTempVisualObjectFNum)
00501 {
00502 tindex = i;
00503 return itsTempVisualObjectDB->getObject(i);
00504 }
00505 }
00506 }
00507
00508 LFATAL("latest object not found; something is wrong");
00509 return itsVisualObjectDB->getObject(0);
00510 }
00511
00512
00513 inline const Point2D<int> Landmark::getLatestOffsetCoords() const
00514 {
00515 if(itsLatestVisualObjectFNum >= itsLatestTempVisualObjectFNum)
00516 {
00517 for(int i = numObjects()-1; i >= 0; i--)
00518 if(itsVisualObjectFNum[i] == itsLatestVisualObjectFNum)
00519 return itsOffsetCoords[i];
00520 }
00521 else
00522 {
00523 for(int i = numTempObjects()-1; i >= 0; i--)
00524 if(itsTempVisualObjectFNum[i] == itsLatestTempVisualObjectFNum)
00525 return itsTempOffsetCoords[i];
00526 }
00527
00528 LFATAL("latest object not found; something is wrong");
00529 return Point2D<int>(-1,-1);
00530 }
00531
00532
00533 inline const rutz::shared_ptr<VisualObject>&
00534 Landmark::getObject(const uint index) const
00535 {
00536 ASSERT(index < numObjects());
00537 return itsVisualObjectDB->getObject(index);
00538 }
00539
00540
00541 inline const uint Landmark::getVisualObjectFNum(uint index) const
00542 {
00543 ASSERT(index < itsVisualObjectFNum.size());
00544 return itsVisualObjectFNum[index];
00545 }
00546
00547
00548 inline const Point2D<int> Landmark::getOffsetCoords(uint index) const
00549 {
00550 ASSERT(index < itsOffsetCoords.size());
00551 return itsOffsetCoords[index];
00552 }
00553
00554
00555 inline const bool Landmark::isSalVisualObject(uint index) const
00556 {
00557 ASSERT(index < numObjects());
00558 return (itsVisualObjectDB->getObject(index)->getSalPoint().i != -1);
00559 }
00560
00561
00562 inline const rutz::shared_ptr<VisualObject>&
00563 Landmark::getTempObject(const uint index) const
00564 {
00565 ASSERT(index < numTempObjects());
00566 return itsTempVisualObjectDB->getObject(index);
00567 }
00568
00569
00570 inline const uint Landmark::getTempVisualObjectFNum(uint index) const
00571 {
00572 ASSERT(index < itsTempVisualObjectFNum.size());
00573 return itsTempVisualObjectFNum[index];
00574 }
00575
00576
00577 inline const Point2D<int> Landmark::getTempOffsetCoords(uint index) const
00578 {
00579 ASSERT(index < itsTempOffsetCoords.size());
00580 return itsTempOffsetCoords[index];
00581 }
00582
00583
00584 inline rutz::shared_ptr<VisualObjectDB>
00585 Landmark::getVisualObjectDB() const
00586 { return itsVisualObjectDB; }
00587
00588
00589 inline void Landmark::eraseObject(const uint index)
00590 {
00591 ASSERT(index < numObjects());
00592 itsVisualObjectDB->eraseObject(index);
00593 }
00594
00595
00596 inline void Landmark::eraseTempObject(const uint index)
00597 {
00598 ASSERT(index < numTempObjects());
00599 itsTempVisualObjectDB->eraseObject(index);
00600 }
00601
00602
00603 inline void Landmark::eraseOffsetCoords(const uint index)
00604 {
00605 ASSERT(index < itsOffsetCoords.size());
00606 std::vector<Point2D<int> >::iterator begin
00607 = itsOffsetCoords.begin();
00608 itsOffsetCoords.erase(begin + index);
00609 }
00610
00611
00612 inline void Landmark::eraseTempOffsetCoords(const uint index)
00613 {
00614 ASSERT(index < itsTempOffsetCoords.size());
00615 std::vector<Point2D<int> >::iterator begin
00616 = itsTempOffsetCoords.begin();
00617 itsTempOffsetCoords.erase(begin + index);
00618 }
00619
00620
00621 inline void Landmark::eraseVisualObjectFNum(const uint index)
00622 {
00623 ASSERT(index < itsVisualObjectFNum.size());
00624 std::vector<uint>::iterator begin
00625 = itsVisualObjectFNum.begin();
00626 itsVisualObjectFNum.erase(begin + index);
00627 }
00628
00629
00630 inline void Landmark::eraseTempVisualObjectFNum(const uint index)
00631 {
00632 ASSERT(index < itsTempVisualObjectFNum.size());
00633 std::vector<uint>::iterator begin
00634 = itsTempVisualObjectFNum.begin();
00635 itsTempVisualObjectFNum.erase(begin + index);
00636 }
00637
00638
00639 inline void Landmark::setCameraIntrinsicParam
00640 (rutz::shared_ptr<CameraIntrinsicParam> cip)
00641 { itsCip = cip; }
00642
00643
00644 inline bool Landmark::haveSessionVO(std::string session)
00645 {
00646 for(uint i = 0; i < itsSession.size(); i++)
00647 if(!itsSession[i].compare(session)) return true;
00648 return false;
00649 }
00650
00651
00652 inline std::pair<uint,uint> Landmark::getSessionIndexRange(const uint index)
00653 {
00654 ASSERT(index < itsSessionIndexRange.size());
00655 return itsSessionIndexRange[index];
00656 }
00657
00658
00659 inline uint Landmark::getNumSession()
00660 {
00661 return itsSession.size();
00662 }
00663
00664
00665 inline std::string Landmark::getSession(const uint index)
00666 {
00667 ASSERT(index < itsSession.size());
00668 return itsSession[index];
00669 }
00670
00671
00672 #endif
00673
00674
00675
00676
00677
00678