1 | |
Найти координаты вхождения изображения(1) в изображение(2)05.08.2010, 17:06. Показов 4365. Ответов 16
Метки нет (Все метки)
Здравствуйте,
задача следующая: Найти координаты вхождения изображения(1) в изображение(2). Пример: (2)изображение 800х600 черного цвета. где-то на изображении белый круг 4х4 пикселя. (1)изображение 4х4 белый круг на черном фоне. Подскажите алгоритм? предположение такое: 1.Перевести оба Bitmap'a в массивы байтов. 2.Искать вхождение одного массива в другой. Был бы рад если подскажите по обоим пунктам.
0
|
05.08.2010, 17:06 | |
Ответы с готовыми решениями:
16
Найти координаты первого вхождения в заданную строку подстроки, состоящей из двух одинаковых заданных символов При наведении на изображение,изображение должн немного затемнится и + по центру изображения треугольник Процедура: при клике на изображение найти расстояние между центром этого и центром другого изображения Координаты при нажатии на изображение |
Заблокирован
|
|
05.08.2010, 17:15 | 2 |
4*4, значит радиус=2
х1=х-2, х2=х+2, у1=y-2, y2=y+2 (x,у)-координаты центра круга или у тебя битмап с кругом круглый
0
|
05.08.2010, 17:30 [ТС] | 3 |
эм. зачем мне центр круга? мне нужны координаты этого круга в изображении 800х600
а круг из себя представляет как раз эту картинку 4х4 Добавлено через 13 секунд эм. зачем мне центр круга? мне нужны координаты этого круга в изображении 800х600 а круг из себя представляет как раз эту картинку 4х4
0
|
Заблокирован
|
|
05.08.2010, 17:40 | 4 |
тогда найди в цикле через GetPixel битмапа (или поверхности на которой рисуешь)координаты первой белой точки(х,у)
(внешний цикл по у, внутренний по х) (х-1,у) - координаты левого верхнего угла маленького битмапа
1
|
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
|
|
05.08.2010, 20:33 | 6 |
Я бы сделал так:
1.Перевести оба Bitmap'a в двухмерные массивы байтов. 2.Искать вхождение одной матрицы в другой.
0
|
05.08.2010, 20:43 [ТС] | 7 |
1)как именно перевести bitmap в двумерный массив байтов? переводить цвета пикселей? или как?
2)было время пытался найти информацию по этому поводу, нашел только про вхождения строк. в принципе эту проблему я решал раньше, но "через задний проход", переводил изображения в строки, через коды цветов, и искал вхождения строк) вот хочу узнать нормальный способ...
0
|
283 / 262 / 32
Регистрация: 11.11.2009
Сообщений: 605
|
||||||
05.08.2010, 20:53 | 8 | |||||
не претендуя на "нормальный способ" может (и скорее всего) есть более оптимальные способы, но нашел код, который похож на то что как я думал делать:
нашел, со следующей строки проверяешь есть ли совпадение по остальным строкам, нет, продолжили поиск
1
|
Заблокирован
|
|||||||||||
05.08.2010, 22:07 | 10 | ||||||||||
Ага, и жди стопятьсот тысяч лет, пока тормозной GetPixel отработает на всей картинке. Для указанных 800x600 и 4x4 это будет в максимуме 800x600x4x4 раз. К тому времени Вселенная состарится.
Прости, а Bitmap за массив не сойдёт? Теоретик кайфа - Как заработать миллион? - Ну берёшь, зарабатываешь сотню, а дальше в том же духе.... Смотри, показываю правильный кошерный быстрый способ.
image - исходная картинка, в которой будем искать подкартинку, subimage - картинка, которую будем искать в image Возвращает функция Point с найденными координатами, а если не нашла вхождение - null. Работает быстро (намного быстрее, чем через GetPixel) за счёт того, что зная формат изображения, мы можем откинуть кучу разных проверок. Изображения должны быть RGB и иметь по восемь бит на канал. Если захочешь добавить, например, альфа канал, замени Format24bppRgb на, например, Format32bppArgb и множители 3 на 4.... ну и т.д. в зависимости от формата изображений. В настройках проекта не забудь выставить Allow unsafe code. Использовать так:
1
|
05.08.2010, 22:36 [ТС] | 11 | |||||
завтра буду тестить)
с виду реально кашерный способ)) а можно вопросы позадавать? что за знак вопроса
и почему тут код unsafe? P.s: Спасибо большое!!
0
|
Заблокирован
|
||||||
05.08.2010, 22:49 | 12 | |||||
Короткая запись вот такой вещи:
Потому что работаем напрямую с памятью через указатели.
1
|
06.08.2010, 21:22 [ТС] | 13 |
у меня изображения с PixelFormat.Format32bppArgb
изменил формат и множители на 4 - не находит. изменил формат а множители оставил 3 - всё работает отлично. успешно подредактировал чтобы искал, отталкиваясь от начальных координат, т.к. у меня subimage встречается несколько раз)
0
|
Заблокирован
|
||||||
06.08.2010, 22:38 | 14 | |||||
Тогда вот так. (Да, забыл сказать, нужно ещё проверку для альфа-канала сделать тогда: *(pixel1 + 3) != *(pixel2 + 3) ).
0
|
Заблокирован
|
|
07.08.2010, 03:21 | 16 |
Мне кажется, это неправильно. Не должно быть 3 для argb. Лучше поищи причину. У меня, кстати, для argb *4 (или <<2, что то же самое) работает.
0
|
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 13
|
|
04.04.2012, 15:53 | 17 |
Подыму тему...
Спасибо! Работает. Правда время выполнения 1054мс на i5 8ГБ мозгов, 800х600 имидж и 8х8 сабимидж. Интересно, есть алгоритмы бегающие раз в десять быстрее?
0
|
04.04.2012, 15:53 | |
04.04.2012, 15:53 | |
Помогаю со студенческими работами здесь
17
Даны целочисленные координаты трех вершин прямоугольника, найти координаты четвертой Найти координаты противоположных углов квадрата если известны координаты A и B Координаты для изображения Найти координаты B, зная координаты A, расстояние до B, зенит и азимут Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |