void bb_scan(tld::TldStruct& tld, Eigen::Vector4d const & bb, Eigen::Vector2i imsize, int minwin) { double shift = 0.1; //used for scaling the bb Eigen::VectorXd scale(21); scale << -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; for (unsigned int i = 0; i < 21; i++) scale(i) = pow(1.2, scale(i)); int minBB = minwin; if (bb_width(bb) < minwin) return; Eigen::VectorXd bbW(21); //scale bb on x axis for (unsigned int x = 0; x < 21; x++) { bbW(x) = floor((bb_width(bb) * scale(x)) + 0.5); } Eigen::VectorXd bbH(21); //scale bb on y axis for (unsigned int x = 0; x < 21; x++) { bbH(x) = floor((bb_height(bb) * scale(x)) + 0.5); } Eigen::VectorXd bbSHH(21); Eigen::VectorXd bbSHW(21); //shift the scales for (unsigned int x = 0; x < 21; x++) bbSHH(x) = bbH(x) * shift; for (unsigned int x = 0; x < 21; x++) { if (bbH(x) <= bbW(x)) bbSHW(x) = bbH(x) * shift; else bbSHW(x) = bbW(x) * shift; } Eigen::VectorXd bbF(4); bbF << 2, 2, imsize(0), imsize(1); Eigen::Matrix<double, 6, Eigen::Dynamic> bbs; Eigen::Matrix<double, 6, Eigen::Dynamic> bbsbak; Eigen::Matrix<double, 2, Eigen::Dynamic> sca; //create a grid of bounding boxes with different scales for (unsigned int i = 0, last_scale = 0; i < 21; i++) { if (bbW(i) < minBB || bbH(i) < minBB) continue; Eigen::VectorXd left; Eigen::VectorXd leftbak; Eigen::VectorXd top; Eigen::VectorXd topbak; double val; val = bbF(0); for (unsigned int p = 0; val <= bbF(2) - bbW(i) - 1; val += bbSHW(i), p++) { leftbak.resize(left.size()); leftbak = left; left.resize(p + 1); if (p > 0) left << leftbak, floor(val + 0.5); else left(0) = floor(val + 0.5); } if(left.size() == 0) continue; val = bbF(1); for (unsigned int p = 0; val <= bbF(3) - bbH(i) - 1; val += bbSHH(i), p++) { topbak.resize(top.size()); topbak = top; top.resize(p + 1); if (p > 0) top << topbak, floor(val + 0.5); else top(0) = floor(val + 0.5); } if(top.size() == 0) continue; Eigen::MatrixXd grid(2, top.size() * left.size()); unsigned int cnt = 0; for (int k = 0; k < left.size(); k++) for (int w = 0; w < top.size(); w++) { grid(0, cnt) = top(w); grid(1, cnt) = left(k); cnt++; } Eigen::MatrixXd bbsnew(6, grid.cols()); bbsnew.row(0) = grid.row(1); bbsnew.row(1) = grid.row(0); bbsnew.row(2) = grid.array().row(1) + bbW(i) - 1; bbsnew.row(3) = grid.array().row(0) + bbH(i) - 1; bbsnew.row(4) = Eigen::MatrixXd::Constant(1, grid.cols(), last_scale + 1); bbsnew.row(5) = Eigen::MatrixXd::Constant(1, grid.cols(), left.size()); bbsbak.resize(6, bbs.cols()); bbsbak = bbs; bbs.resize(6, bbs.cols() + bbsnew.cols()); //lets have some fun! if (i > 0) bbs << bbsbak, bbsnew; else bbs = bbsnew; //save the scales on x and y axis sca.conservativeResize(2, sca.cols() + 1); sca(0, sca.cols() - 1) = bbH(i); sca(1, sca.cols() - 1) = bbW(i); last_scale++; } tld.grid = bbs; tld.nGrid = bbs.cols(); tld.scales = sca; }