From 071092d97c0495a1bbfb84faeb544fe846818f93 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Fri, 21 Aug 2015 04:06:58 +0900 Subject: [PATCH] Added VOT2015 Dataset interface + VOT2015 sample cpp --- .../include/opencv2/datasets/track_vot.hpp | 26 +- modules/datasets/samples/track_vot.cpp | 12 +- modules/datasets/src/track_vot.cpp | 369 +++++++++--------- 3 files changed, 205 insertions(+), 202 deletions(-) diff --git a/modules/datasets/include/opencv2/datasets/track_vot.hpp b/modules/datasets/include/opencv2/datasets/track_vot.hpp index 6249f0289..bc611edf3 100644 --- a/modules/datasets/include/opencv2/datasets/track_vot.hpp +++ b/modules/datasets/include/opencv2/datasets/track_vot.hpp @@ -44,9 +44,15 @@ #include #include +#include +#include #include "opencv2/datasets/dataset.hpp" #include "opencv2/datasets/util.hpp" +#include + +#include +#include using namespace std; @@ -62,30 +68,30 @@ struct TRACK_votObj : public Object { int id; std::string imagePath; - vector gtbb; + vector gtbb; }; class CV_EXPORTS TRACK_vot : public Dataset { public: - static Ptr create(); + static Ptr create(); virtual void load(const std::string &path) = 0; - virtual int getDatasetsNum() = 0; + virtual int getDatasetsNum() = 0; - virtual int getDatasetLength(int id) = 0; + virtual int getDatasetLength(int id) = 0; - virtual bool initDataset(int id) = 0; + virtual bool initDataset(int id) = 0; - virtual bool getNextFrame(Mat &frame) = 0; + virtual bool getNextFrame(Mat &frame) = 0; - virtual vector getGT() = 0; + virtual vector getGT() = 0; protected: - vector > > data; - int activeDatasetID; - int frameCounter; + vector > > data; + int activeDatasetID; + int frameCounter; }; //! @} diff --git a/modules/datasets/samples/track_vot.cpp b/modules/datasets/samples/track_vot.cpp index 4b5937604..a8a661431 100644 --- a/modules/datasets/samples/track_vot.cpp +++ b/modules/datasets/samples/track_vot.cpp @@ -55,6 +55,8 @@ using namespace std; using namespace cv; using namespace cv::datasets; +#define DATASET_ID 1 + int main(int argc, char *argv[]) { const char *keys = @@ -72,18 +74,18 @@ int main(int argc, char *argv[]) } Ptr dataset = TRACK_vot::create(); - dataset->load(path); + dataset->load("D:/opencv/VOT 2015"); printf("Datasets number: %d\n", dataset->getDatasetsNum()); for (int i = 1; i <= dataset->getDatasetsNum(); i++) printf("\tDataset #%d size: %d\n", i, dataset->getDatasetLength(i)); - dataset->initDataset(datasetID); + dataset->initDataset(DATASET_ID); - for (int i = 0; i < dataset->getDatasetLength(datasetID); i++) + for (int i = 0; i < dataset->getDatasetLength(DATASET_ID); i++) { Mat frame; - if (!dataset->getNextFrame(frame)) - break; + dataset->getNextFrame(frame); + //Draw Ground Truth BB vector gtPoints = dataset->getGT(); for (int j = 0; j < (int)(gtPoints.size()-1); j++) diff --git a/modules/datasets/src/track_vot.cpp b/modules/datasets/src/track_vot.cpp index a6e336cc5..d9d6181b9 100644 --- a/modules/datasets/src/track_vot.cpp +++ b/modules/datasets/src/track_vot.cpp @@ -41,196 +41,191 @@ #include "opencv2/datasets/track_vot.hpp" -#include -#include -#include - using namespace std; namespace cv { - namespace datasets + +namespace datasets +{ + +class TRACK_votImpl : public TRACK_vot +{ +public: + //Constructor + TRACK_votImpl() + { + + activeDatasetID = 1; + frameCounter = 0; + } + //Destructor + virtual ~TRACK_votImpl() {} + + //Load Dataset + virtual void load(const string &path); + + virtual int getDatasetsNum(); + + virtual int getDatasetLength(int id); + + virtual bool initDataset(int id); + + virtual bool getNextFrame(Mat &frame); + + virtual vector getGT(); + +private: + void loadDataset(const string &path); + + string numberToString(int number); +}; + +void TRACK_votImpl::load(const string &path) +{ + loadDataset(path); +} + +string TRACK_votImpl::numberToString(int number) +{ + string out; + char numberStr[9]; + sprintf(numberStr, "%u", number); + for (unsigned int i=0; i<8-strlen(numberStr); ++i) { - - class TRACK_votImpl : public TRACK_vot - { - public: - //Constructor - TRACK_votImpl() - { - activeDatasetID = 1; - frameCounter = 0; - } - //Destructor - virtual ~TRACK_votImpl() {} - - //Load Dataset - virtual void load(const string &path); - - protected: - virtual int getDatasetsNum(); - - virtual int getDatasetLength(int id); - - virtual bool initDataset(int id); - - virtual bool getNextFrame(Mat &frame); - - virtual vector getGT(); - - void loadDataset(const string &path); - - string numberToString(int number); - }; - - void TRACK_votImpl::load(const string &path) - { - loadDataset(path); - } - - string TRACK_votImpl::numberToString(int number) - { - string out; - char numberStr[9]; - sprintf(numberStr, "%u", number); - for (unsigned int i = 0; i < 8 - strlen(numberStr); ++i) - { - out += "0"; - } - out += numberStr; - return out; - } - - inline bool fileExists(const std::string& name) - { - struct stat buffer; - return (stat(name.c_str(), &buffer) == 0); - } - - void TRACK_votImpl::loadDataset(const string &rootPath) - { - string nameListPath = rootPath + "/list.txt"; - ifstream namesList(nameListPath.c_str()); - vector datasetsLengths; - string datasetName; - - if (namesList.is_open()) - { - int currDatasetID = 0; - - //All datasets/folders loop - while (getline(namesList, datasetName)) - { - currDatasetID++; - vector > objects; - - //All frames/images loop - Ptr currDataset(new TRACK_votObj); - - //Open dataset's ground truth file - string gtListPath = rootPath + "/" + datasetName + "/groundtruth.txt"; - ifstream gtList(gtListPath.c_str()); - if (!gtList.is_open()) - printf("Error to open groundtruth.txt!!!"); - - //Make a list of datasets lengths - int currFrameID = 1; - if (currDatasetID == 0) - printf("VOT 2015 Dataset Initialization...\n"); - bool trFLG = true; - do - { - currFrameID++; - string fullPath = rootPath + "/" + datasetName + "/" + numberToString(currFrameID) + ".jpg"; - if (!fileExists(fullPath)) - break; - - //Make VOT Object - Ptr currObj(new TRACK_votObj); - currObj->imagePath = fullPath; - currObj->id = currFrameID; - - //Get Ground Truth data - double x1 = 0, y1 = 0, - x2 = 0, y2 = 0, - x3 = 0, y3 = 0, - x4 = 0, y4 = 0; - string tmp; - getline(gtList, tmp); - sscanf(tmp.c_str(), "%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4); - currObj->gtbb.push_back(Point2d(x1, y1)); - currObj->gtbb.push_back(Point2d(x2, y2)); - currObj->gtbb.push_back(Point2d(x3, y3)); - currObj->gtbb.push_back(Point2d(x4, y4)); - - //Add object to storage - objects.push_back(currObj); - - } while (trFLG); - - datasetsLengths.push_back(currFrameID - 1); - data.push_back(objects); - } - } - else - { - printf("Couldn't find a *list.txt* in VOT 2015 folder!!!"); - } - - namesList.close(); - return; - } - - int TRACK_votImpl::getDatasetsNum() - { - return (int)(data.size()); - } - - int TRACK_votImpl::getDatasetLength(int id) - { - if (id > 0 && id <= (int)data.size()) - return (int)(data[id - 1].size()); - else - { - printf("Dataset ID is out of range...\nAllowed IDs are: 1~%d\n", (int)data.size()); - return -1; - } - } - - bool TRACK_votImpl::initDataset(int id) - { - if (id > 0 && id <= (int)data.size()) - { - activeDatasetID = id; - return true; - } - else - { - printf("Dataset ID is out of range...\nAllowed IDs are: 1~%d\n", (int)data.size()); - return false; - } - } - - bool TRACK_votImpl::getNextFrame(Mat &frame) - { - if (frameCounter >= (int)data[activeDatasetID - 1].size()) - return false; - string imgPath = data[activeDatasetID - 1][frameCounter]->imagePath; - frame = imread(imgPath); - frameCounter++; - return !frame.empty(); - } - - Ptr TRACK_vot::create() - { - return Ptr(new TRACK_votImpl); - } - - vector TRACK_votImpl::getGT() - { - Ptr currObj = data[activeDatasetID - 1][frameCounter - 1]; - return currObj->gtbb; - } - + out += "0"; } -} \ No newline at end of file + out += numberStr; + return out; +} + +inline bool fileExists(const std::string& name) +{ + struct stat buffer; + return (stat(name.c_str(), &buffer) == 0); +} + +void TRACK_votImpl::loadDataset(const string &rootPath) +{ + ifstream namesList(rootPath + "/list.txt"); + //ifstream lengthsList(rootPath + "/lengths.txt"); + vector datasetsLengths; + string datasetName; + + if (namesList.is_open()) + { + int currDatasetID = 0; + + //All datasets/folders loop + while (getline(namesList, datasetName)) + { + currDatasetID++; + vector > objects; + + //All frames/images loop + Ptr currDataset(new TRACK_votObj); + + //Open dataset's ground truth file + ifstream gtList(rootPath + "/" + datasetName + "/groundtruth.txt"); + if (!gtList.is_open()) + cout << "Error to open groundtruth.txt!!!"; + + //Make a list of datasets lengths + int currFrameID = 1; + if (currDatasetID == 0) + cout << "VOT 2015 Dataset Initialization...\n"; + + do + { + currFrameID++; + string fullPath = rootPath + "/" + datasetName + "/" + numberToString(currFrameID) + ".jpg"; + if (!fileExists(fullPath)) + break; + + //Make VOT Object + Ptr currObj(new TRACK_votObj); + currObj->imagePath = fullPath; + currObj->id = currFrameID; + + //Get Ground Truth data + double x1 = 0, y1 = 0, + x2 = 0, y2 = 0, + x3 = 0, y3 = 0, + x4 = 0, y4 = 0; + string tmp; + getline(gtList, tmp); + sscanf(tmp.c_str(), "%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf", &x1, &y1, &x2, &y2, &x3, &y3, &x4, &y4); + currObj->gtbb.push_back(Point2d(x1, y1)); + currObj->gtbb.push_back(Point2d(x2, y2)); + currObj->gtbb.push_back(Point2d(x3, y3)); + currObj->gtbb.push_back(Point2d(x4, y4)); + + //Add object to storage + objects.push_back(currObj); + + } while (true); + + datasetsLengths.push_back(currFrameID-1); + data.push_back(objects); + } + } + else + { + cout << rootPath + "Couldn't find a *list.txt* in VOT 2015 folder!!!"; + } + + namesList.close(); + return; +} + +int TRACK_votImpl::getDatasetsNum() +{ + return data.size(); +} + +int TRACK_votImpl::getDatasetLength(int id) +{ + if (id > 0 && id <= (int)data.size()) + return data[id - 1].size(); + else + { + cout << "Dataset ID is out of range...\n " << "Allowed IDs are: 1~" << (int)data.size() << endl; + return -1; + } +} + +bool TRACK_votImpl::initDataset(int id) +{ + if (id > 0 && id <= (int)data.size()) + { + activeDatasetID = id; + return true; + } + else + { + cout << "Dataset ID is out of range...\n " << "Allowed IDs are: 1~" << (int)data.size() << endl; + return false; + } +} + +bool TRACK_votImpl::getNextFrame(Mat &frame) +{ + frame = imread(data[activeDatasetID - 1][frameCounter]->imagePath); + frameCounter++; + return !frame.empty(); +} + +Ptr TRACK_vot::create() +{ + return Ptr(new TRACK_votImpl); +} + +vector TRACK_votImpl::getGT() +{ + Ptr currObj = data[activeDatasetID - 1][frameCounter - 1]; + return currObj->gtbb; +} + +} +} +