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]);
}
}
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;
+}