114 lines
3.6 KiB
C++
114 lines
3.6 KiB
C++
// Copyright (C) 2011 Davis E. King (davis@dlib.net)
|
|
// License: Boost Software License See LICENSE.txt for the full license.
|
|
#ifndef DLIB_DETECTION_TEMPlATE_TOOLS_Hh_
|
|
#define DLIB_DETECTION_TEMPlATE_TOOLS_Hh_
|
|
|
|
#include "detection_template_tools_abstract.h"
|
|
#include "../geometry.h"
|
|
#include "../matrix.h"
|
|
#include <utility>
|
|
#include <vector>
|
|
#include <cmath>
|
|
|
|
namespace dlib
|
|
{
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
inline rectangle compute_box_dimensions (
|
|
const double width_to_height_ratio,
|
|
const double area
|
|
)
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_ASSERT(width_to_height_ratio > 0 && area > 0,
|
|
"\t rectangle compute_box_dimensions()"
|
|
<< "\n\t Invalid arguments were given to this function. "
|
|
<< "\n\t width_to_height_ratio: " << width_to_height_ratio
|
|
<< "\n\t area: " << area
|
|
);
|
|
|
|
/*
|
|
width*height == area
|
|
width/height == width_to_height_ratio
|
|
*/
|
|
using namespace std;
|
|
|
|
const int height = (int)std::floor(std::sqrt(area/width_to_height_ratio) + 0.5);
|
|
const int width = (int)std::floor(area/height + 0.5);
|
|
|
|
return centered_rect(0,0,width,height);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
inline std::vector<rectangle> create_single_box_detection_template (
|
|
const rectangle& object_box
|
|
)
|
|
{
|
|
std::vector<rectangle> temp;
|
|
temp.push_back(object_box);
|
|
return temp;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
inline std::vector<rectangle> create_overlapped_2x2_detection_template (
|
|
const rectangle& object_box
|
|
)
|
|
{
|
|
std::vector<rectangle> result;
|
|
|
|
const point c = center(object_box);
|
|
|
|
result.push_back(rectangle() + c + object_box.tl_corner() + object_box.tr_corner());
|
|
result.push_back(rectangle() + c + object_box.bl_corner() + object_box.br_corner());
|
|
result.push_back(rectangle() + c + object_box.tl_corner() + object_box.bl_corner());
|
|
result.push_back(rectangle() + c + object_box.tr_corner() + object_box.br_corner());
|
|
|
|
return result;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
inline std::vector<rectangle> create_grid_detection_template (
|
|
const rectangle& object_box,
|
|
unsigned int cells_x,
|
|
unsigned int cells_y
|
|
)
|
|
{
|
|
// make sure requires clause is not broken
|
|
DLIB_ASSERT(cells_x > 0 && cells_y > 0,
|
|
"\t std::vector<rectangle> create_grid_detection_template()"
|
|
<< "\n\t The number of cells along a dimension can't be zero. "
|
|
<< "\n\t cells_x: " << cells_x
|
|
<< "\n\t cells_y: " << cells_y
|
|
);
|
|
|
|
std::vector<rectangle> result;
|
|
|
|
const matrix<double,1> x = linspace(object_box.left(), object_box.right(), cells_x+1);
|
|
const matrix<double,1> y = linspace(object_box.top(), object_box.bottom(), cells_y+1);
|
|
|
|
for (long j = 0; j+1 < y.size(); ++j)
|
|
{
|
|
for (long i = 0; i+1 < x.size(); ++i)
|
|
{
|
|
const dlib::vector<double,2> tl(x(i),y(j));
|
|
const dlib::vector<double,2> br(x(i+1),y(j+1));
|
|
result.push_back(rectangle(tl,br));
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------------------
|
|
|
|
}
|
|
|
|
|
|
#endif // DLIB_DETECTION_TEMPlATE_TOOLS_Hh_
|
|
|
|
|