У меня есть два почти одинаковых изображения с той разницей, что формы на втором изображении немного отличаются. Большую часть времени меньше, но может быть больше. Кроме того, число фигур в одном изображении может варьироваться от ~ 10 до> 100 и может быть относительно близко друг к другу.
Это будет выглядеть примерно так (обратите внимание: оба изображения будут непрозрачными):
Черный треугольник — изображение 1, серый треугольник — изображение 2.
Теперь я хочу добавить предопределенное поле (3 пикселя здесь — по обеим сторонам контура) к краям изображения 1 и проверить, находятся ли края второго изображения в том же диапазоне, что и первое изображение. Если нет, отобразите это визуально:
Слева вверху: небольшая разница между двумя изображениями (отображается красным контуром)
Справа внизу: «Тот же» край -> Без разницы
Как я могу лучше всего достичь этого?
Я использую OpenCV с C ++
Если фигуры находятся на одинаковых позициях на обоих изображениях и вам просто нужны маркеры на изображении без дополнительной информации, этот простой трюк может сделать это.
#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);
}
Вот несколько примеров изображений:
Треугольник становится намного больше, шаткая вещь становится намного меньше, а квадрация немного сжимается.
Таким образом, мы хотели бы иметь треугольник и колебание, но не квад.
И это именно наш результат.