У меня есть 2 изображения BMP. ImageA является снимком экрана (пример), ImageB является подмножеством этого. Скажите, например, значок.
Я хочу найти эти X, Y координаты ImageB в ImageA (если он существует).
Какая-либо идея, как я сделал бы это?
Если ответы на первые два вопроса - Нет и Да, то у вас простая задача. Это также поможет узнать ответ на Q3.
Обновление:
Основная идея такова: вместо того, чтобы сопоставлять окно вокруг каждого пикселя на изображенииВ с каждым пикселем на изображенииА и проверять корреляцию, давайте определим точки интереса (или особенности) на обоих изображениях, которые будут отслеживаемыми. Итак, похоже, что углы действительно отслеживаются, поскольку область вокруг них вроде как похожа (не вдаваясь в подробности) - следовательно, давайте найдем несколько действительно сильных углов на обоих изображениях и будем искать углы, которые выглядят наиболее похожими.
Это сводит проблему поиска каждого пикселя в B с A к поиску, скажем, 500 углов в B с 1000 углов в A (или что-то в этом роде) - гораздо быстрее.
И самое замечательное, что в вашем распоряжении несколько таких детекторов углов в OpenCV. Если вы не хотите использовать emguCV (C# varriant), то используйте детектор FAST для поиска совпадающих углов и, таким образом, обнаружения нескольких особенностей между изображениями. Получив это, вы можете найти местоположение левого верхнего угла изображения.
Если изображение B является точным подмножеством изображения A (то есть значения пикселей точно такие же), это не проблема с обработкой изображений, это просто сопоставление строк в 2D. В 99% случаев, если взять линию из середины B и сопоставить ее с каждой строкой A, вы сделаете то, что вы хотите, и очень быстро & mdhas; Думаю, в C # есть для этого функция. После того, как вы получите свои совпадения (обычно несколько из них), просто сравните все B с соответствующей частью A.
Единственная проблема, которую я вижу здесь, заключается в том, что в некоторых случаях вы можете получить слишком много совпадений. Например. если A - ваш рабочий стол, B - это значок, и вам не повезло выбрать строку в B, состоящую только из фона. Эту проблему легко решить (нужно более тщательно выбирать строки из B), но это зависит от специфики вашей проблемы.
Поиск дополнительных изображений в изображении
Найти изображение в изображении
Проверить, существует ли изображение в другом изображении