1 #include "internal/node.h"
9 XY Node::centroid()
const {
11 const int32_t m_pixels_size{
static_cast<int32_t
>(m_pixels->size())};
14 if (m_pixels_size == 0) {
18 for (
auto &[_, pos] : *m_pixels) {
23 centroid.x /= m_pixels_size;
24 centroid.y /= m_pixels_size;
30 const int32_t m_pixels_size{
static_cast<int32_t
>(m_pixels->size())};
33 if (m_pixels_size == 0) {
40 for (
auto &[color, _] : *m_pixels) {
51 return {
static_cast<uint8_t
>(r),
static_cast<uint8_t
>(g),
static_cast<uint8_t
>(b)};
54 std::array<int32_t, 4> Node::bounding_box_xywh()
const {
55 if (m_pixels->empty()) {
59 int32_t x_min{INT_MAX};
60 int32_t y_min{INT_MAX};
63 for (
auto &[_, p] : *m_pixels) {
78 for (
auto &p : m_edge_pixels) {
93 const int32_t w{x_max - x_min + 1};
94 const int32_t h{y_max - y_min + 1};
96 return std::array<int32_t, 4>{x_min, y_min, w, h};
99 std::array<int, 4> Node::create_binary_image(std::vector<uint8_t> &binary)
const {
100 std::array<int, 4> xywh{bounding_box_xywh()};
102 binary.resize(
static_cast<size_t>(xywh[2]) *
static_cast<size_t>(xywh[3]), 0);
104 for (
auto &[_, p] : *m_pixels) {
105 int32_t _x = p.x - xywh[0];
106 int32_t _y = p.y - xywh[1];
107 binary[_y * xywh[2] + _x] = 1;
111 for (
auto &p : m_edge_pixels) {
112 int32_t _x = p.x - xywh[0];
113 int32_t _y = p.y - xywh[1];
114 binary[_y * xywh[2] + _x] = 1;
120 void Node::clear_contour(
void) {
121 m_contours.contours.clear();
122 m_contours.hierarchy.clear();
123 m_contours.is_hole.clear();
124 m_contours.colors.clear();
125 m_contours.curves.clear();
128 void Node::compute_contour(
void) {
134 std::vector<uint8_t> binary;
135 std::array<int, 4> xywh{create_binary_image(binary)};
142 ContoursResult contour_res = contours::find_contours(binary, bw, bh);
144 for (
size_t cidx = 0; cidx < contour_res.contours.size(); ++cidx) {
145 auto &contour = contour_res.contours[cidx];
146 for (
auto &p : contour) {
155 m_contours.contours.push_back(contour);
156 m_contours.hierarchy.push_back(contour_res.hierarchy[cidx]);
157 m_contours.is_hole.push_back(contour_res.is_hole[cidx]);
158 m_contours.colors.push_back(col);
161 m_contours.curves.resize(m_contours.contours.size());
164 void Node::add_pixels(
const std::vector<RGBXY> &new_pixels) {
165 for (
auto &c : new_pixels) {
166 m_pixels->push_back(c);
170 void Node::add_edge_pixel(
const XY edge_pixel) {
171 m_edge_pixels.insert(edge_pixel);
174 void Node::clear_edge_pixels() {
175 m_edge_pixels.clear();
178 void Node::clear_all() {
181 m_edge_pixels.clear();