Covert vector to python list
[trackerpp.git] / src / MultiTracker.cpp
index 01e60c5..267ba0f 100644 (file)
@@ -9,67 +9,64 @@ using namespace cv;
 using namespace Eigen;
 
 static const std::string TAG = "MultiTracker";
-MultiTracker::MultiTracker(MetricsPtr m) : metrics(m)
+static const cv::Size PREFERRED_SIZE = Size(64, 128);
+
+#define MaxCost  100000
+
+MultiTracker::MultiTracker()
 {
     LOG_DEBUG(TAG, "init - load model.pkl");
     predictor = PredictorWrapper::create("./python/model.pkl");
     predictor->dump();
+    this->descriptor = {cv::Size(64, 128), cv::Size(16, 16), cv::Size(8, 8), cv::Size(8, 8), 9};
+    std::vector<double> ff (40, 1);
+    predictor->predict(4, ff);
 }
 
-
 MultiTracker::~MultiTracker()
 {
     trackers.clear();
 }
-//
-//TrackerPtr MultiTracker::createTracker(int id)
-//{
-//    TrackerPtr t (new Tracker(id));
-//    addTracker(t);
-//    return t;
-//}
-//
-//void MultiTracker::addTracker(TrackerPtr t)
-//{
-//    trackers.push_back(t);
-//}
-//
-void MultiTracker::removeTracker(TrackerPtr t)
-{
-//    trackers.erase(t);
-}
-
-void MultiTracker::initNewTrackers(cv::Mat& iamge)
-{
-}
 
 
-void MultiTracker::correctTrackers(MetricsPtr m, Mat& image)
+static std::vector<double> similarity(const PatchPtr p1, const PatchPtr p2)
 {
-}
+    std::vector<double> feature;
+    cv::Mat im1(PREFERRED_SIZE, p1->image_crop.type());
+    cv::Mat im2(PREFERRED_SIZE, p2->image_crop.type());
+    cv::resize(p1->image_crop, im1, im1.size());
+    cv::resize(p2->image_crop, im2, im2.size());
+    cv::Mat result;
+    cv::matchTemplate(im1, im2, result, CV_TM_CCOEFF_NORMED);
+    feature.push_back(result.at<double>(0, 0));
+    cv::matchTemplate(im1, im2, result, CV_TM_CCORR_NORMED);
+    feature.push_back(result.at<double>(0, 0));
 
-void calculate_edistance()
-{
+    return feature;
 }
 
-#define MaxCost  100000
 
-static double distance(TrackerPtr t, const cv::Mat& image, const Detection& d)
+double MultiTracker::distance(TrackerPtr t, const cv::Mat& image, const Detection& d)
 {
-    return 0.1;
+    PatchPtr patch = createPatch(image);
+    std::vector<double> features;
+    std::vector<double> ss;
+    for (const auto i : t->patches){
+        ss = similarity(i, patch);
+        features.insert(features.end(),  ss.begin(), ss.end());
+    }
+    //predictor->predict();
+    return 0.1; 
 }
 
 void MultiTracker::update(unsigned int total, const Detection* detections, const Mat& image)
 {
-    // correct_trackers
-    // Generate cost matrix
     int row = trackers.size();
     int col = total;
     MatrixXi cost_matrix = MatrixXi::Zero(row, col);
     for (int i = 0; i < row; i++){
         for (int j = 0; j < col; j++){
             // TODO
-            // int cost = MaxCost;
             cost_matrix(i, j) = distance(trackers[i], image, detections[j]);
         }
     }
@@ -103,3 +100,17 @@ void MultiTracker::update(unsigned int total, const Detection* detections, const
         this->trackers.push_back(t);
     }
 }
+
+PatchPtr MultiTracker::createPatch(const cv::Mat& image)
+{
+    PatchPtr patch(new Patch());
+    std::vector<float> feature_hog;
+    cv::Mat img;
+    cv::resize(image, img, PREFERRED_SIZE);
+    this->descriptor.compute(img, feature_hog);
+
+    cv::Mat hist;
+    //cv::calcHist()
+    patch->image_crop = image;
+    return patch;
+}