49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
|
|
#include "yolo_seg_geometry.h"
|
||
|
|
|
||
|
|
#include <cassert>
|
||
|
|
#include <cmath>
|
||
|
|
#include <vector>
|
||
|
|
|
||
|
|
namespace {
|
||
|
|
|
||
|
|
bool close_to(double actual, double expected, double tolerance = 1e-6) {
|
||
|
|
return std::abs(actual - expected) <= tolerance;
|
||
|
|
}
|
||
|
|
|
||
|
|
} // namespace
|
||
|
|
|
||
|
|
int main() {
|
||
|
|
const unsigned char mask[] = {
|
||
|
|
0, 0, 0, 0, 0, 0,
|
||
|
|
0, 255, 255, 255, 255, 0,
|
||
|
|
0, 255, 255, 255, 255, 0,
|
||
|
|
0, 255, 255, 255, 255, 0,
|
||
|
|
0, 0, 0, 0, 0, 0,
|
||
|
|
};
|
||
|
|
const auto boundary = yolo_seg_geometry::mask_boundary(mask, 6, 5, 6, 10, 20);
|
||
|
|
assert(!boundary.empty());
|
||
|
|
|
||
|
|
const auto rect = yolo_seg_geometry::minimum_area_rect(boundary);
|
||
|
|
assert(rect.valid);
|
||
|
|
assert(close_to(rect.center_x, 12.5));
|
||
|
|
assert(close_to(rect.center_y, 22.0));
|
||
|
|
assert(close_to(rect.width, 3.0));
|
||
|
|
assert(close_to(rect.height, 2.0));
|
||
|
|
|
||
|
|
const auto circle = yolo_seg_geometry::minimum_enclosing_circle(boundary);
|
||
|
|
assert(circle.valid);
|
||
|
|
assert(close_to(circle.center_x, 12.5));
|
||
|
|
assert(close_to(circle.center_y, 22.0));
|
||
|
|
assert(close_to(circle.radius, std::sqrt(13.0) * 0.5));
|
||
|
|
|
||
|
|
const std::vector<yolo_seg_geometry::Point> rotated_square = {
|
||
|
|
{0.0, -2.0}, {2.0, 0.0}, {0.0, 2.0}, {-2.0, 0.0}};
|
||
|
|
const auto rotated = yolo_seg_geometry::minimum_area_rect(rotated_square);
|
||
|
|
assert(rotated.valid);
|
||
|
|
assert(close_to(rotated.center_x, 0.0));
|
||
|
|
assert(close_to(rotated.center_y, 0.0));
|
||
|
|
assert(close_to(rotated.width, std::sqrt(8.0)));
|
||
|
|
assert(close_to(rotated.height, std::sqrt(8.0)));
|
||
|
|
return 0;
|
||
|
|
}
|