Сравните края изображения с полем в OpenCV

У меня есть два почти одинаковых изображения с той разницей, что формы на втором изображении немного отличаются. Большую часть времени меньше, но может быть больше. Кроме того, число фигур в одном изображении может варьироваться от ~ 10 до> 100 и может быть относительно близко друг к другу.
Это будет выглядеть примерно так (обратите внимание: оба изображения будут непрозрачными):

Изображение 1

Черный треугольник — изображение 1, серый треугольник — изображение 2.

Теперь я хочу добавить предопределенное поле (3 пикселя здесь — по обеим сторонам контура) к краям изображения 1 и проверить, находятся ли края второго изображения в том же диапазоне, что и первое изображение. Если нет, отобразите это визуально:

введите описание изображения здесь

Слева вверху: небольшая разница между двумя изображениями (отображается красным контуром)

Справа внизу: «Тот же» край -> Без разницы

Как я могу лучше всего достичь этого?

Я использую OpenCV с C ++

1

Решение

Если фигуры находятся на одинаковых позициях на обоих изображениях и вам просто нужны маркеры на изображении без дополнительной информации, этот простой трюк может сделать это.

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img1 = imread("D:/1.png");
Mat img2 = imread("D:/2.png");
Mat diff;
absdiff(img1, img2, diff);
cv::threshold(diff, diff, 128, 255, THRESH_BINARY);
Mat markers;
int minRadiusDiff = 2;
erode(diff, markers, Mat(), cv::Point(-1, -1), minRadiusDiff / 2);
imwrite("D:/out.png", markers);
}

Вот несколько примеров изображений:

введите описание изображения здесь

Треугольник становится намного больше, шаткая вещь становится намного меньше, а квадрация немного сжимается.

введите описание изображения здесь

Таким образом, мы хотели бы иметь треугольник и колебание, но не квад.

введите описание изображения здесь

И это именно наш результат.

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector