#include "yolo_seg_geometry.h" #include #include #include 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 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; }