Skip to content

Commit

Permalink
test on ubuntu
Browse files Browse the repository at this point in the history
  • Loading branch information
foolwood committed Feb 21, 2017
1 parent 0fd103d commit a278b54
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 134 deletions.
13 changes: 13 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
cmake_minimum_required(VERSION 2.8)
project(DAT)
aux_source_directory(./src/ SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})

IF (WIN32)
set(OpenCV_DIR D:/opencv310/build)
ENDIF(WIN32)
IF (UNIX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") #c++11
ENDIF (UNIX)
find_package(OpenCV REQUIRED)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
Binary file added TEST_ON_UBUNTU1604.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 5 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@ This is a C++ reimplementation of algorithm presented in "In Defense of Color-ba
For more info and implementation in other languages visit the autor's [webpage](https://lrs.icg.tugraz.at/members/possegger)!.


###speed
###speed
Test in Windows Intel i7 4760
![speed](speed.png)

Test in ubuntu 16.04 Intel i7 6700
![speed](TEST_ON_UBUNTU1604.png)

###Reference
```
@INPROCEEDINGS{possegger15a,
Expand Down
107 changes: 52 additions & 55 deletions dat_tracker.cpp → src/dat_tracker.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#include "dat_tracker.hpp"

void DAT_TRACKER::tracker_dat_initialize(cv::Mat I, cv::Rect region){
void DAT_TRACKER::tracker_dat_initialize(cv::Mat I, cv::Rect region) {

double cx = region.x + double(region.width - 1) / 2.0;
double cy = region.y + double(region.height - 1) / 2.0;
Expand Down Expand Up @@ -50,7 +50,7 @@ void DAT_TRACKER::tracker_dat_initialize(cv::Mat I, cv::Rect region){
target_sz_history_.push_back(cv::Size(target_sz.width / scale_factor_, target_sz.height / scale_factor_));
}

cv::Rect DAT_TRACKER::tracker_dat_update(cv::Mat I){
cv::Rect DAT_TRACKER::tracker_dat_update(cv::Mat I) {

cv::Mat img_preprocessed;
cv::resize(I, img_preprocessed, cv::Size(), scale_factor_, scale_factor_);
Expand Down Expand Up @@ -94,10 +94,10 @@ cv::Rect DAT_TRACKER::tracker_dat_update(cv::Mat I){
pm_search_dist = getForegroundProb(search_win, prob_lut_distractor_, cfg.bin_mapping);
pm_search = (pm_search + pm_search_dist)/2.;
}
pm_search.setTo(0, padded_search_win);
pm_search.setTo(0.0, padded_search_win);

// Cosine / Hanning window
cv::Mat cos_win = CalculateHann(search_sz);
cv::Mat cos_win = calculateHann(search_sz);

std::vector<cv::Rect> hypotheses;
std::vector<double> vote_scores;
Expand All @@ -108,7 +108,7 @@ cv::Rect DAT_TRACKER::tracker_dat_update(cv::Mat I){

std::vector<cv::Point> candidate_centers;
std::vector<double> candidate_scores;
for (int i = 0; i < hypotheses.size(); ++i) {
for (size_t i = 0; i < hypotheses.size(); ++i) {
candidate_centers.push_back(cv::Point(hypotheses[i].x + hypotheses[i].width / 2,
hypotheses[i].y + hypotheses[i].height / 2));
candidate_scores.push_back(vote_scores[i] * dist_scores[i]);
Expand All @@ -126,7 +126,7 @@ cv::Rect DAT_TRACKER::tracker_dat_update(cv::Mat I){
for (int i = 0; i < hypotheses.size(); ++i){
if (i != best_candidate) {
distractors.push_back(hypotheses[i]);
distractor_overlap.push_back(intersectionOverUnion(target_rect, distractors.back()));
distractor_overlap.push_back(intersectionOverUnion(target_rect, hypotheses[i]));
}
}
} else {
Expand Down Expand Up @@ -208,18 +208,18 @@ cv::Rect DAT_TRACKER::tracker_dat_update(cv::Mat I){

void DAT_TRACKER::getNMSRects(cv::Mat prob_map, cv::Size obj_sz, double scale,
double overlap, double score_frac, cv::Mat dist_map, bool include_inner,
std::vector<cv::Rect> &top_rects, std::vector<double> &top_vote_scores, std::vector<double> &top_dist_scores){
std::vector<cv::Rect> &top_rects, std::vector<double> &top_vote_scores, std::vector<double> &top_dist_scores) {
int height = prob_map.rows;
int width = prob_map.cols;
cv::Size rect_sz(floor(obj_sz.width * scale), floor(obj_sz.height * scale));
int o_x, o_y;
if (include_inner) {
o_x = round(max(1.0, rect_sz.width*0.2));
o_y = round(max(1.0, rect_sz.height*0.2));
o_x = round(max(1.0, rect_sz.width * 0.2));
o_y = round(max(1.0, rect_sz.height * 0.2));
}

int stepx = max(1, int(round(rect_sz.width * (1 - overlap))));
int stepy = max(1, int(round(rect_sz.height * (1 - overlap))));
int stepx = max(1, int(round(rect_sz.width * (1.0 - overlap))));
int stepy = max(1, int(round(rect_sz.height * (1.0 - overlap))));

std::vector<int> posx, posy;
for (int i = 0; i <= (width -1 - rect_sz.width); i = i + stepx)
Expand All @@ -240,7 +240,7 @@ void DAT_TRACKER::getNMSRects(cv::Mat prob_map, cv::Size obj_sz, double scale,
b.setTo(height-1, b > (height-1));

std::vector<cv::Rect> boxes;
for (int i = 0; i < x.rows; ++i){
for (int i = 0; i < x.rows; ++i) {
for (int j = 0; j < x.cols; ++j) {
boxes.push_back(cv::Rect(x.at<int>(i, j), y.at<int>(i, j),
r.at<int>(i, j) - x.at<int>(i, j),
Expand All @@ -249,11 +249,12 @@ void DAT_TRACKER::getNMSRects(cv::Mat prob_map, cv::Size obj_sz, double scale,
}
std::vector<cv::Rect> boxes_inner;
if (include_inner) {
for (int i = 0; i < x.rows; ++i){
for (int j = 0; j < x.cols; ++j)
for (int i = 0; i < x.rows; ++i) {
for (int j = 0; j < x.cols; ++j) {
boxes_inner.push_back(cv::Rect(x.at<int>(i, j) + o_x, y.at<int>(i, j) + o_y,
r.at<int>(i, j) - 2 * o_x - x.at<int>(i, j),
b.at<int>(i, j) - 2 * o_y - y.at<int>(i, j)));
}
}
}

Expand All @@ -263,22 +264,21 @@ void DAT_TRACKER::getNMSRects(cv::Mat prob_map, cv::Size obj_sz, double scale,
int h = height + 1;
int w = width + 1;
std::vector<cv::Point>bl, br, tl, tr;
for (int i = 0; i < x.rows; ++i){
for (int j = 0; j < x.cols; ++j){
for (int i = 0; i < x.rows; ++i) {
for (int j = 0; j < x.cols; ++j) {
bl.push_back(cv::Point(l.at<int>(i, j), b.at<int>(i, j)));
br.push_back(cv::Point(r.at<int>(i, j), b.at<int>(i, j)));
tl.push_back(cv::Point(l.at<int>(i, j), t.at<int>(i, j)));
tr.push_back(cv::Point(r.at<int>(i, j), t.at<int>(i, j)));
}

}
}
cv::Size rect_sz_inner;
std::vector<cv::Point>bl_inner, br_inner, tl_inner, tr_inner;
if (include_inner){
if (include_inner) {
rect_sz_inner.width = rect_sz.width - 2 * o_x;
rect_sz_inner.height = rect_sz.height - 2 *o_y; //[r - l - 2 * o_x, b - t - 2 * o_y];
for (int i = 0; i < x.rows; ++i){
for (int j = 0; j < x.cols; ++j){
for (int i = 0; i < x.rows; ++i) {
for (int j = 0; j < x.cols; ++j) {
bl_inner.push_back(cv::Point(l.at<int>(i, j) + o_x, b.at<int>(i, j) - o_y));
br_inner.push_back(cv::Point(r.at<int>(i, j) - o_x, b.at<int>(i, j) - o_y));
tl_inner.push_back(cv::Point(l.at<int>(i, j) + o_x, t.at<int>(i, j) + o_y));
Expand All @@ -294,13 +294,13 @@ void DAT_TRACKER::getNMSRects(cv::Mat prob_map, cv::Size obj_sz, double scale,

std::vector<float> v_scores;
std::vector<float> d_scores;
for (int i = 0; i < bl.size(); ++i){
for (size_t i = 0; i < bl.size(); ++i) {
v_scores.push_back(intProbMap.at<double>(br[i]) - intProbMap.at<double>(bl[i]) - intProbMap.at<double>(tr[i]) + intProbMap.at<double>(tl[i]));
d_scores.push_back(intDistMap.at<double>(br[i]) - intDistMap.at<double>(bl[i]) - intDistMap.at<double>(tr[i]) + intDistMap.at<double>(tl[i]));
}
std::vector<float> scores_inner;
if (include_inner){
for (int i = 0; i < bl.size(); ++i){
if (include_inner) {
for (size_t i = 0; i < bl.size(); ++i) {
scores_inner.push_back(intProbMap.at<double>(br_inner[i]) - intProbMap.at<double>(bl_inner[i]) - intProbMap.at<double>(tr_inner[i]) + intProbMap.at<double>(tl_inner[i]));
v_scores[i] = v_scores[i] / double(rect_sz.area()) + scores_inner[i] / double(rect_sz_inner.area());
}
Expand All @@ -315,7 +315,7 @@ void DAT_TRACKER::getNMSRects(cv::Mat prob_map, cv::Size obj_sz, double scale,
double best_score = ms;

while (ms > score_frac * best_score){
prob_map(boxes[midx]) = 0;
prob_map(boxes[midx]) = cv::Scalar(0.0);
top_rects.push_back(boxes[midx]);
top_vote_scores.push_back(v_scores[midx]);
top_dist_scores.push_back(d_scores[midx]);
Expand All @@ -327,7 +327,7 @@ void DAT_TRACKER::getNMSRects(cv::Mat prob_map, cv::Size obj_sz, double scale,
br.erase(br.begin() + midx);
tl.erase(tl.begin() + midx);
tr.erase(tr.begin() + midx);
if (include_inner){
if (include_inner) {
bl_inner.erase(bl_inner.begin() + midx);
br_inner.erase(br_inner.begin() + midx);
tl_inner.erase(tl_inner.begin() + midx);
Expand All @@ -338,13 +338,13 @@ void DAT_TRACKER::getNMSRects(cv::Mat prob_map, cv::Size obj_sz, double scale,
cv::integral(dist_map, intDistMap);

v_scores.clear(); d_scores.clear();
for (int i = 0; i < bl.size(); ++i){
for (size_t i = 0; i < bl.size(); ++i) {
v_scores.push_back(intProbMap.at<double>(br[i]) - intProbMap.at<double>(bl[i]) - intProbMap.at<double>(tr[i]) + intProbMap.at<double>(tl[i]));
d_scores.push_back(intDistMap.at<double>(br[i]) - intDistMap.at<double>(bl[i]) - intDistMap.at<double>(tr[i]) + intDistMap.at<double>(tl[i]));
}
scores_inner.clear();
if (include_inner){
for (int i = 0; i < bl.size(); ++i){
if (include_inner) {
for (size_t i = 0; i < bl.size(); ++i){
scores_inner.push_back(intProbMap.at<double>(br_inner[i]) - intProbMap.at<double>(bl_inner[i]) - intProbMap.at<double>(tr_inner[i]) + intProbMap.at<double>(tl_inner[i]));
v_scores[i] = v_scores[i] / (rect_sz.area()) + scores_inner[i] / (rect_sz_inner.area());
}
Expand All @@ -370,10 +370,10 @@ cv::Mat DAT_TRACKER::getForegroundDistractorProbs(cv::Mat frame, cv::Rect obj_re

cv::Mat Md(frame.size(), CV_8UC1, cv::Scalar(0));
cv::Mat Mo(frame.size(), CV_8UC1, cv::Scalar(0));
for (int i = 0; i < distractors.size(); ++i) {
Mo(distractors[i]) = true;
for (size_t i = 0; i < distractors.size(); ++i) {
Mo(distractors[i]) = cv::Scalar(255);
}
Mo(obj_rect) = true;
Mo(obj_rect) = cv::Scalar(255);

cv::Mat obj_hist, distr_hist;
cv::calcHist(&frame, imgCount, channels, Md, distr_hist, dims, sizes, ranges);
Expand All @@ -382,17 +382,17 @@ cv::Mat DAT_TRACKER::getForegroundDistractorProbs(cv::Mat frame, cv::Rect obj_re
return prob_lut;
}

cv::Mat DAT_TRACKER::CalculateHann(cv::Size sz) {
cv::Mat DAT_TRACKER::calculateHann(cv::Size sz) {
cv::Mat temp1(Size(sz.width, 1), CV_32FC1);
cv::Mat temp2(Size(sz.height, 1), CV_32FC1);
for (int i = 0; i < sz.width; ++i)
temp1.at<float>(0, i) = 0.5*(1 - cos(2 * PI*i / (sz.width - 1)));
temp1.at<float>(0, i) = 0.5*(1 - cos(2 * PI * i / (sz.width - 1)));
for (int i = 0; i < sz.height; ++i)
temp2.at<float>(0, i) = 0.5*(1 - cos(2 * PI*i / (sz.height - 1)));
temp2.at<float>(0, i) = 0.5*(1 - cos(2 * PI * i / (sz.height - 1)));
return temp2.t()*temp1;
}

cv::Mat DAT_TRACKER::getForegroundProb(cv::Mat frame, cv::Mat prob_lut, cv::Mat bin_mapping){
cv::Mat DAT_TRACKER::getForegroundProb(cv::Mat frame, cv::Mat prob_lut, cv::Mat bin_mapping) {
cv::Mat frame_bin;
cv::Mat prob_map(frame.size(), CV_32FC1);
cv::LUT(frame, bin_mapping, frame_bin);
Expand All @@ -406,8 +406,7 @@ cv::Mat DAT_TRACKER::getForegroundProb(cv::Mat frame, cv::Mat prob_lut, cv::Mat
return prob_map;
}

void DAT_TRACKER::getSubwindowMasked(cv::Mat im, cv::Point pos, cv::Size sz, cv::Mat &out, cv::Mat &mask){

void DAT_TRACKER::getSubwindowMasked(cv::Mat im, cv::Point pos, cv::Size sz, cv::Mat &out, cv::Mat &mask) {
int xs_1 = floor(pos.x) + 1 - floor(double(sz.width) / 2.);
int xs_2 = floor(pos.x) + sz.width - floor(double(sz.width) / 2.);
int ys_1 = floor(pos.y) + 1 - floor(double(sz.height) / 2.);
Expand All @@ -416,14 +415,14 @@ void DAT_TRACKER::getSubwindowMasked(cv::Mat im, cv::Point pos, cv::Size sz, cv:
out = getSubwindow(im, pos, sz);

cv::Rect bbox(xs_1, ys_1, sz.width, sz.height);
bbox = bbox&cv::Rect(0, 0, im.cols - 1, im.rows - 1);
bbox = bbox&cv::Rect(0, 0, im.cols, im.rows);
bbox.x = bbox.x - xs_1;
bbox.y = bbox.y - ys_1;
mask = cv::Mat(sz, CV_8UC1,cv::Scalar(1));
mask(bbox) = 0;
mask = cv::Mat(sz, CV_8UC1, cv::Scalar(255));
mask(bbox) = cv::Scalar(0);
}

cv::Point DAT_TRACKER::getMotionPrediction(std::vector<cv::Point>values, int maxNumFrames){
cv::Point DAT_TRACKER::getMotionPrediction(std::vector<cv::Point>values, int maxNumFrames) {
cv::Point2f pred(0, 0);
if (values.size() < 3){
pred.x = 0; pred.y = 0;
Expand All @@ -442,7 +441,7 @@ cv::Point DAT_TRACKER::getMotionPrediction(std::vector<cv::Point>values, int max
P.push_back(cv::Point2f(A1*(V[i].x - V[i - 2].x) + A2*(V[i - 1].x - V[i - 2].x),
A1*(V[i].y - V[i - 2].y) + A2*(V[i - 1].y - V[i - 2].y)));
}
for (int i = 0; i < P.size(); ++i){
for (size_t i = 0; i < P.size(); ++i){
pred.x += P[i].x;
pred.y += P[i].y;
}
Expand Down Expand Up @@ -486,15 +485,14 @@ void DAT_TRACKER::getForegroundBackgroundProbs(cv::Mat frame, cv::Rect obj_rect,
cv::Mat frame_bin;
cv::LUT(frame, bin_mapping, frame_bin);
for (int i = 0; i < prob_map.rows; ++i) {
for (int j = 0; j < prob_map.cols; ++j){
for (int j = 0; j < prob_map.cols; ++j) {
prob_map.at<float>(i, j) = prob_lut.at<float>(frame_bin.at<cv::Vec3b>(i, j)[0],
frame_bin.at<cv::Vec3b>(i, j)[1],
frame_bin.at<cv::Vec3b>(i, j)[2]);
}
}
}


void DAT_TRACKER::getForegroundBackgroundProbs(cv::Mat frame, cv::Rect obj_rect, int num_bins, cv::Mat &prob_lut) {
int imgCount = 1;
const int channels[] = { 0, 1, 2 };
Expand All @@ -520,13 +518,13 @@ void DAT_TRACKER::getForegroundBackgroundProbs(cv::Mat frame, cv::Rect obj_rect,
obj_height = (frame.rows - 1) - obj_row;

cv::Mat obj_win;
frame(cv::Rect(max(0, obj_col), max(0, obj_row), obj_width + 1, obj_height + 1)).copyTo(obj_win);
frame(cv::Rect(max(0, obj_col), max(0, obj_row),
obj_col + obj_width + 1 - max(0, obj_col), obj_row + obj_height + 1 - max(0, obj_row))).copyTo(obj_win);
cv::calcHist(&obj_win, imgCount, channels, mask, obj_hist, dims, sizes, ranges);
prob_lut = (obj_hist + 1) / (surr_hist + 2);
prob_lut = (obj_hist + 1.) / (surr_hist + 2.);
}


double DAT_TRACKER::getAdaptiveThreshold(cv::Mat prob_map, cv::Rect obj_coords){
double DAT_TRACKER::getAdaptiveThreshold(cv::Mat prob_map, cv::Rect obj_coords) {
cv::Mat obj_prob_map = prob_map(obj_coords).clone();

int bins = 21;
Expand Down Expand Up @@ -559,8 +557,7 @@ double DAT_TRACKER::getAdaptiveThreshold(cv::Mat prob_map, cv::Rect obj_coords){
float xmin = 100;
int min_index = 0;
for (int i = 0; i < x.rows; ++i) {
if (xmin > x.at<float>(i, 0))
{
if (xmin > x.at<float>(i, 0)) {
xmin = x.at<float>(i, 0);
min_index = i;
}
Expand All @@ -570,26 +567,26 @@ double DAT_TRACKER::getAdaptiveThreshold(cv::Mat prob_map, cv::Rect obj_coords){
return threshold;
}

cv::Rect DAT_TRACKER::pos2rect(cv::Point obj_center, cv::Size obj_size, cv::Size win_size){
cv::Rect DAT_TRACKER::pos2rect(cv::Point obj_center, cv::Size obj_size, cv::Size win_size) {
cv::Rect rect(round(obj_center.x - obj_size.width / 2), round(obj_center.y - obj_size.height / 2), obj_size.width, obj_size.height);
cv::Rect border(0, 0, win_size.width - 1, win_size.height - 1);
return rect&border;
}

cv::Rect DAT_TRACKER::pos2rect(cv::Point obj_center, cv::Size obj_size){
cv::Rect DAT_TRACKER::pos2rect(cv::Point obj_center, cv::Size obj_size) {
cv::Rect rect(round(obj_center.x - obj_size.width / 2), round(obj_center.y - obj_size.height / 2), obj_size.width, obj_size.height);
return rect;
}

cv::Mat DAT_TRACKER::getBinMapping(int num_bins){
cv::Mat DAT_TRACKER::getBinMapping(int num_bins) {
cv::Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for (int i = 0; i < 256; ++i)
p[i] = i / (255 / num_bins);
return lookUpTable;
}

dat_cfg DAT_TRACKER::default_parameters_dat(dat_cfg cfg){
dat_cfg DAT_TRACKER::default_parameters_dat(dat_cfg cfg) {
cfg.bin_mapping = getBinMapping(cfg.num_bins);
for (double i = 0; i <= 20; i++)
cfg.adapt_thresh_prob_bins.push_back(i*0.05);
Expand Down
2 changes: 1 addition & 1 deletion dat_tracker.hpp → src/dat_tracker.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class DAT_TRACKER

cv::Mat getForegroundProb(cv::Mat frame, cv::Mat prob_lut, cv::Mat bin_mapping);

cv::Mat CalculateHann(cv::Size sz);
cv::Mat calculateHann(cv::Size sz);

double intersectionOverUnion(cv::Rect target_rect, cv::Rect candidates);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ class dat_cfg {
public:
bool show_figures = false;
int img_scale_target_diagonal = 75;
double search_win_padding = 2;
double search_win_padding = 2.;
double surr_win_factor = 1.9;
int color_space = 1; //1rgb 2lab 3hsv 4gray
int num_bins = 16;
Expand Down
Loading

0 comments on commit a278b54

Please sign in to comment.