Commit e0f7b41a authored by Davis King's avatar Davis King

Added the drectangle object and switched a few interpolation related APIs over

to use it.
parent e485838b
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#define DLIB_GEOMETRy_HEADER #define DLIB_GEOMETRy_HEADER
#include "geometry/rectangle.h" #include "geometry/rectangle.h"
#include "geometry/drectangle.h"
#include "geometry/vector.h" #include "geometry/vector.h"
#include "geometry/border_enumerator.h" #include "geometry/border_enumerator.h"
#include "geometry/point_transforms.h" #include "geometry/point_transforms.h"
......
// Copyright (C) 2015 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#ifndef DLIB_DRECTANGLe_
#define DLIB_DRECTANGLe_
#include "drectangle_abstract.h"
#include "rectangle.h"
namespace dlib
{
class drectangle;
drectangle operator* (
const drectangle& rect,
const double& scale
);
// ----------------------------------------------------------------------------------------
class drectangle
{
public:
drectangle (
) : l(0), t(0), r(-1), b(-1) {}
drectangle (
double l_,
double t_,
double r_,
double b_
) :
l(l_),
t(t_),
r(r_),
b(b_)
{}
drectangle (
const dlib::vector<double,2>& p
) :
l(p.x()),
t(p.y()),
r(p.x()),
b(p.y())
{
}
template <typename T, typename U>
drectangle (
const vector<T,2>& p1,
const vector<U,2>& p2
)
{
*this = drectangle(p1) + drectangle(p2);
}
drectangle (
const rectangle& rect
) : l(rect.left()),
t(rect.top()),
r(rect.right()),
b(rect.bottom()) {}
operator rectangle (
) const
{
return rectangle((long)std::floor(l+0.5),
(long)std::floor(t+0.5),
(long)std::floor(r+0.5),
(long)std::floor(b+0.5));
}
double left() const { return l; }
double top() const { return t; }
double right() const { return r; }
double bottom() const { return b; }
double& left() { return l; }
double& top() { return t; }
double& right() { return r; }
double& bottom() { return b; }
const dlib::vector<double,2> tl_corner (
) const { return dlib::vector<double,2>(left(), top()); }
const dlib::vector<double,2> bl_corner (
) const { return dlib::vector<double,2>(left(), bottom()); }
const dlib::vector<double,2> tr_corner (
) const { return dlib::vector<double,2>(right(), top()); }
const dlib::vector<double,2> br_corner (
) const { return dlib::vector<double,2>(right(), bottom()); }
double width (
) const
{
if (is_empty())
return 0;
else
return r - l;
}
double height (
) const
{
if (is_empty())
return 0;
else
return b - t;
}
double area (
) const
{
return width()*height();
}
bool is_empty (
) const { return (t > b || l > r); }
drectangle operator + (
const drectangle& rhs
) const
{
if (rhs.is_empty())
return *this;
else if (is_empty())
return rhs;
return drectangle (
std::min(l,rhs.l),
std::min(t,rhs.t),
std::max(r,rhs.r),
std::max(b,rhs.b)
);
}
drectangle intersect (
const drectangle& rhs
) const
{
return drectangle (
std::max(l,rhs.l),
std::max(t,rhs.t),
std::min(r,rhs.r),
std::min(b,rhs.b)
);
}
bool contains (
const dlib::vector<double,2>& p
) const
{
if (p.x() < l || p.x() > r || p.y() < t || p.y() > b)
return false;
return true;
}
bool contains (
const drectangle& rect
) const
{
if (rect.is_empty())
return true;
if (l <= rect.left() &&
r >= rect.right() &&
t <= rect.top() &&
b >= rect.bottom())
return true;
return false;
}
drectangle& operator *= (
const double& scale
)
{
*this = *this*scale;
return *this;
}
drectangle& operator /= (
const double& scale
)
{
*this = *this*(1.0/scale);
return *this;
}
private:
double l;
double t;
double r;
double b;
};
// ----------------------------------------------------------------------------------------
inline void serialize (
const drectangle& item,
std::ostream& out
)
{
try
{
serialize(item.left(),out);
serialize(item.top(),out);
serialize(item.right(),out);
serialize(item.bottom(),out);
}
catch (serialization_error& e)
{
throw serialization_error(e.info + "\n while serializing an object of type drectangle");
}
}
inline void deserialize (
drectangle& item,
std::istream& in
)
{
try
{
deserialize(item.left(),in);
deserialize(item.top(),in);
deserialize(item.right(),in);
deserialize(item.bottom(),in);
}
catch (serialization_error& e)
{
throw serialization_error(e.info + "\n while deserializing an object of type drectangle");
}
}
inline std::ostream& operator<< (
std::ostream& out,
const drectangle& item
)
{
out << "[(" << item.left() << ", " << item.top() << ") (" << item.right() << ", " << item.bottom() << ")]";
return out;
}
inline std::istream& operator>>(
std::istream& in,
drectangle& item
)
{
// ignore any whitespace
while (in.peek() == ' ' || in.peek() == '\t' || in.peek() == '\r' || in.peek() == '\n')
in.get();
// now eat the leading '[' character
if (in.get() != '[')
{
in.setstate(in.rdstate() | std::ios::failbit);
return in;
}
dlib::vector<double,2> p1, p2;
in >> p1;
in >> p2;
item = drectangle(p1) + drectangle(p2);
// ignore any whitespace
while (in.peek() == ' ' || in.peek() == '\t' || in.peek() == '\r' || in.peek() == '\n')
in.get();
// now eat the trailing ']' character
if (in.get() != ']')
{
in.setstate(in.rdstate() | std::ios::failbit);
}
return in;
}
// ----------------------------------------------------------------------------------------
inline dlib::vector<double,2> center (
const drectangle& rect
)
{
dlib::vector<double,2> temp(rect.left() + rect.right(),
rect.top() + rect.bottom());
return temp/2.0;
}
inline dlib::vector<double,2> dcenter (
const drectangle& rect
)
{
return center(rect);
}
inline drectangle operator* (
const drectangle& rect,
const double& scale
)
{
const double width = rect.width()*scale;
const double height = rect.height()*scale;
const dlib::vector<double,2> p = center(rect);
return drectangle(p.x()-width/2, p.y()-height/2, p.x()+width/2, p.y()+height/2);
}
inline drectangle operator* (
const double& scale,
const drectangle& rect
)
{
return rect*scale;
}
inline drectangle operator/ (
const drectangle& rect,
const double& scale
)
{
return rect*(1.0/scale);
}
inline drectangle operator+ (
const drectangle& r,
const dlib::vector<double,2>& p
)
{
return r + drectangle(p);
}
inline drectangle operator+ (
const dlib::vector<double,2>& p,
const drectangle& r
)
{
return r + drectangle(p);
}
inline drectangle translate_rect (
const drectangle& rect,
const dlib::vector<double,2>& p
)
{
drectangle result;
result.top () = rect.top() + p.y();
result.bottom () = rect.bottom() + p.y();
result.left () = rect.left() + p.x();
result.right () = rect.right() + p.x();
return result;
}
inline drectangle intersect (
const drectangle& a,
const drectangle& b
) { return a.intersect(b); }
inline double area (
const drectangle& a
) { return a.area(); }
inline drectangle centered_drect (
const dlib::vector<double,2>& p,
const double& width,
const double& height
)
{
return drectangle(p.x()-width/2, p.y()-height/2, p.x()+width/2, p.y()+height/2);
}
// ----------------------------------------------------------------------------------------
}
#endif // DLIB_DRECTANGLe_
This diff is collapsed.
...@@ -62,36 +62,36 @@ namespace dlib ...@@ -62,36 +62,36 @@ namespace dlib
// ----------------------------- // -----------------------------
rectangle rect_up ( drectangle rect_up (
const rectangle& rect const drectangle& rect
) const ) const
{ {
return rectangle(point_up(rect.tl_corner()), point_up(rect.br_corner())); return drectangle(point_up(rect.tl_corner()), point_up(rect.br_corner()));
} }
rectangle rect_up ( drectangle rect_up (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const ) const
{ {
return rectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels)); return drectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels));
} }
// ----------------------------- // -----------------------------
rectangle rect_down ( drectangle rect_down (
const rectangle& rect const drectangle& rect
) const ) const
{ {
return rectangle(point_down(rect.tl_corner()), point_down(rect.br_corner())); return drectangle(point_down(rect.tl_corner()), point_down(rect.br_corner()));
} }
rectangle rect_down ( drectangle rect_down (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const ) const
{ {
return rectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels)); return drectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels));
} }
// ----------------------------- // -----------------------------
...@@ -196,36 +196,36 @@ namespace dlib ...@@ -196,36 +196,36 @@ namespace dlib
// ----------------------------- // -----------------------------
rectangle rect_up ( drectangle rect_up (
const rectangle& rect const drectangle& rect
) const ) const
{ {
return rectangle(point_up(rect.tl_corner()), point_up(rect.br_corner())); return drectangle(point_up(rect.tl_corner()), point_up(rect.br_corner()));
} }
rectangle rect_up ( drectangle rect_up (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const ) const
{ {
return rectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels)); return drectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels));
} }
// ----------------------------- // -----------------------------
rectangle rect_down ( drectangle rect_down (
const rectangle& rect const drectangle& rect
) const ) const
{ {
return rectangle(point_down(rect.tl_corner()), point_down(rect.br_corner())); return drectangle(point_down(rect.tl_corner()), point_down(rect.br_corner()));
} }
rectangle rect_down ( drectangle rect_down (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const ) const
{ {
return rectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels)); return drectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels));
} }
// ----------------------------- // -----------------------------
...@@ -538,36 +538,36 @@ namespace dlib ...@@ -538,36 +538,36 @@ namespace dlib
// ----------------------------- // -----------------------------
rectangle rect_up ( drectangle rect_up (
const rectangle& rect const drectangle& rect
) const ) const
{ {
return rectangle(point_up(rect.tl_corner()), point_up(rect.br_corner())); return drectangle(point_up(rect.tl_corner()), point_up(rect.br_corner()));
} }
rectangle rect_up ( drectangle rect_up (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const ) const
{ {
return rectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels)); return drectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels));
} }
// ----------------------------- // -----------------------------
rectangle rect_down ( drectangle rect_down (
const rectangle& rect const drectangle& rect
) const ) const
{ {
return rectangle(point_down(rect.tl_corner()), point_down(rect.br_corner())); return drectangle(point_down(rect.tl_corner()), point_down(rect.br_corner()));
} }
rectangle rect_down ( drectangle rect_down (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const ) const
{ {
return rectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels)); return drectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels));
} }
// ----------------------------- // -----------------------------
...@@ -889,36 +889,36 @@ namespace dlib ...@@ -889,36 +889,36 @@ namespace dlib
// ----------------------------- // -----------------------------
rectangle rect_up ( drectangle rect_up (
const rectangle& rect const drectangle& rect
) const ) const
{ {
return rectangle(point_up(rect.tl_corner()), point_up(rect.br_corner())); return drectangle(point_up(rect.tl_corner()), point_up(rect.br_corner()));
} }
rectangle rect_up ( drectangle rect_up (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const ) const
{ {
return rectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels)); return drectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels));
} }
// ----------------------------- // -----------------------------
rectangle rect_down ( drectangle rect_down (
const rectangle& rect const drectangle& rect
) const ) const
{ {
return rectangle(point_down(rect.tl_corner()), point_down(rect.br_corner())); return drectangle(point_down(rect.tl_corner()), point_down(rect.br_corner()));
} }
rectangle rect_down ( drectangle rect_down (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const ) const
{ {
return rectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels)); return drectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels));
} }
template < template <
......
...@@ -109,21 +109,21 @@ namespace dlib ...@@ -109,21 +109,21 @@ namespace dlib
point_up(point_down(P)) == P point_up(point_down(P)) == P
!*/ !*/
rectangle rect_down ( drectangle rect_down (
const rectangle& rect const drectangle& rect
) const; ) const;
/*! /*!
ensures ensures
- returns rectangle(point_down(rect.tl_corner()), point_down(rect.br_corner())); - returns drectangle(point_down(rect.tl_corner()), point_down(rect.br_corner()));
(i.e. maps rect into a downsampled) (i.e. maps rect into a downsampled)
!*/ !*/
rectangle rect_up ( drectangle rect_up (
const rectangle& rect const drectangle& rect
) const; ) const;
/*! /*!
ensures ensures
- returns rectangle(point_up(rect.tl_corner()), point_up(rect.br_corner())); - returns drectangle(point_up(rect.tl_corner()), point_up(rect.br_corner()));
(i.e. maps rect into a parent image) (i.e. maps rect into a parent image)
!*/ !*/
...@@ -155,23 +155,23 @@ namespace dlib ...@@ -155,23 +155,23 @@ namespace dlib
point_up(p,0) == p, etc. ) point_up(p,0) == p, etc. )
!*/ !*/
rectangle rect_down ( drectangle rect_down (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const; ) const;
/*! /*!
ensures ensures
- returns rectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels)); - returns drectangle(point_down(rect.tl_corner(),levels), point_down(rect.br_corner(),levels));
(i.e. Basically applies rect_down() to rect levels times and returns the result.) (i.e. Basically applies rect_down() to rect levels times and returns the result.)
!*/ !*/
rectangle rect_up ( drectangle rect_up (
const rectangle& rect, const drectangle& rect,
unsigned int levels unsigned int levels
) const; ) const;
/*! /*!
ensures ensures
- returns rectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels)); - returns drectangle(point_up(rect.tl_corner(),levels), point_up(rect.br_corner(),levels));
(i.e. Basically applies rect_up() to rect levels times and returns the result.) (i.e. Basically applies rect_up() to rect levels times and returns the result.)
!*/ !*/
......
...@@ -1426,15 +1426,15 @@ namespace dlib ...@@ -1426,15 +1426,15 @@ namespace dlib
struct chip_details struct chip_details
{ {
chip_details() : angle(0), rows(0), cols(0) {} chip_details() : angle(0), rows(0), cols(0) {}
chip_details(const rectangle& rect_) : rect(rect_),angle(0), rows(rect_.height()), cols(rect_.width()) {} chip_details(const drectangle& rect_) : rect(rect_),angle(0), rows(rect_.height()), cols(rect_.width()) {}
chip_details(const rectangle& rect_, unsigned long size) : rect(rect_),angle(0) chip_details(const drectangle& rect_, unsigned long size) : rect(rect_),angle(0)
{ compute_dims_from_size(size); } { compute_dims_from_size(size); }
chip_details(const rectangle& rect_, unsigned long size, double angle_) : rect(rect_),angle(angle_) chip_details(const drectangle& rect_, unsigned long size, double angle_) : rect(rect_),angle(angle_)
{ compute_dims_from_size(size); } { compute_dims_from_size(size); }
chip_details(const rectangle& rect_, const chip_dims& dims) : chip_details(const drectangle& rect_, const chip_dims& dims) :
rect(rect_),angle(0),rows(dims.rows), cols(dims.cols) {} rect(rect_),angle(0),rows(dims.rows), cols(dims.cols) {}
chip_details(const rectangle& rect_, const chip_dims& dims, double angle_) : chip_details(const drectangle& rect_, const chip_dims& dims, double angle_) :
rect(rect_),angle(angle_),rows(dims.rows), cols(dims.cols) {} rect(rect_),angle(angle_),rows(dims.rows), cols(dims.cols) {}
template <typename T> template <typename T>
...@@ -1463,13 +1463,13 @@ namespace dlib ...@@ -1463,13 +1463,13 @@ namespace dlib
// Note that the translation and scale part are represented by the extraction // Note that the translation and scale part are represented by the extraction
// rectangle. So here we build the appropriate rectangle. // rectangle. So here we build the appropriate rectangle.
const double scale = length(p); const double scale = length(p);
rect = centered_rect(tform(point(dims.cols,dims.rows)/2.0), rect = centered_drect(tform(point(dims.cols,dims.rows)/2.0),
static_cast<unsigned long>(dims.cols*scale + 0.5), dims.cols*scale,
static_cast<unsigned long>(dims.rows*scale + 0.5)); dims.rows*scale);
} }
rectangle rect; drectangle rect;
double angle; double angle;
unsigned long rows; unsigned long rows;
unsigned long cols; unsigned long cols;
...@@ -1611,7 +1611,7 @@ namespace dlib ...@@ -1611,7 +1611,7 @@ namespace dlib
for (unsigned long i = 0; i < chip_locations.size(); ++i) for (unsigned long i = 0; i < chip_locations.size(); ++i)
{ {
long depth = 0; long depth = 0;
rectangle rect = pyr.rect_down(chip_locations[i].rect); drectangle rect = pyr.rect_down(chip_locations[i].rect);
while (rect.area() > chip_locations[i].size()) while (rect.area() > chip_locations[i].size())
{ {
rect = pyr.rect_down(rect); rect = pyr.rect_down(rect);
...@@ -1647,7 +1647,7 @@ namespace dlib ...@@ -1647,7 +1647,7 @@ namespace dlib
// figure out which level in the pyramid to use to extract the chip // figure out which level in the pyramid to use to extract the chip
int level = -1; int level = -1;
rectangle rect = chip_locations[i].rect; drectangle rect = chip_locations[i].rect;
while (pyr.rect_down(rect).area() > chip_locations[i].size()) while (pyr.rect_down(rect).area() > chip_locations[i].size())
{ {
++level; ++level;
......
...@@ -923,7 +923,7 @@ namespace dlib ...@@ -923,7 +923,7 @@ namespace dlib
!*/ !*/
chip_details( chip_details(
const rectangle& rect_ const drectangle& rect_
); );
/*! /*!
ensures ensures
...@@ -935,7 +935,7 @@ namespace dlib ...@@ -935,7 +935,7 @@ namespace dlib
!*/ !*/
chip_details( chip_details(
const rectangle& rect_, const drectangle& rect_,
unsigned long size_ unsigned long size_
); );
/*! /*!
...@@ -956,7 +956,7 @@ namespace dlib ...@@ -956,7 +956,7 @@ namespace dlib
!*/ !*/
chip_details( chip_details(
const rectangle& rect_, const drectangle& rect_,
unsigned long size_, unsigned long size_,
double angle_ double angle_
); );
...@@ -978,7 +978,7 @@ namespace dlib ...@@ -978,7 +978,7 @@ namespace dlib
!*/ !*/
chip_details( chip_details(
const rectangle& rect_, const drectangle& rect_,
const chip_dims& dims const chip_dims& dims
); );
/*! /*!
...@@ -991,7 +991,7 @@ namespace dlib ...@@ -991,7 +991,7 @@ namespace dlib
!*/ !*/
chip_details( chip_details(
const rectangle& rect_, const drectangle& rect_,
const chip_dims& dims, const chip_dims& dims,
double angle_ double angle_
); );
...@@ -1034,7 +1034,7 @@ namespace dlib ...@@ -1034,7 +1034,7 @@ namespace dlib
- returns the number of pixels in this chip. This is just rows*cols. - returns the number of pixels in this chip. This is just rows*cols.
!*/ !*/
rectangle rect; drectangle rect;
double angle; double angle;
unsigned long rows; unsigned long rows;
unsigned long cols; unsigned long cols;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment