Can anybody see if there is an issue with this code because for some reason my open/close transformations don't work as opencv's
template <bool is_erosion, size_t N>
auto apply_mask(const mask_t<N>& mask, const point<int16_t>& p, coords_translate_fn fn_src) {
constexpr auto lower_boundary = -(static_cast<ssize_t>(N)/2);
constexpr auto upper_boundary = (static_cast<ssize_t>(N)/2);
// N = 3 => N/2 = 1
// i,j range: -1 0 1
// i + N/2 range: 0 1 2
uint16_t result = 0;
for (int16_t i = lower_boundary; i <= upper_boundary; i++) {
for (int16_t j = lower_boundary; j <= upper_boundary; j++) {
const point<int16_t>& current_position{
static_cast<int16_t>(p.x + i),
static_cast<int16_t>(p.y + j)};
if (is_erosion) {
if (current_position.x < 0 || current_position.x >= height) {
result += 1;
continue;
}
if (current_position.y < 0 || current_position.y >= width) {
result += 1;
continue;
}
} else {
if (current_position.x < 0 || current_position.x >= height) continue;
if (current_position.y < 0 || current_position.y >= width) continue;
}
const auto& current_pixel = fn_src(current_position.x, current_position.y);
result += mask[i + upper_boundary][j + upper_boundary] * (current_pixel == 0xff);
}
}
return result;
}
template <size_t N>
void close(const mask_t<N>& mask, coords_translate_fn src, coords_translate_fn dst, uint16_t iterations = 1) {
for (uint16_t i = 0; i < iterations; ++i) {
//std::cout << i << std::endl;
Serial.println(i);
dilate(mask, src, dst);
erode(mask, dst, src);
}
}