| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > Сравнение картинок |
| Автор: welt 19.5.2009, 23:22 | ||
| Вобщем такая задача: Есть две картинки: большая и маленькая. Маленькая -это кусок картинки прямоугольного размера, вырезанный из большой каринки. Нужно, найти, с какого места (координаты) малая картинка вырезана из большой. Для этого надо сравать в цикле попиксельно две картинки: вырезать из большой прямоугольнуюобласть и сравнивать с маленькой. Сравнивать по яркости пикселей. и так в цикле передвигаться по большой, вырезать из нее область и сравнивать. Пр сравнении двух одинаковых по рамеру областец я складываю разность яркостей всех пикселей этих областей. Если эта яркость равна нулю, то картинка найдена. Вроде написал, но очень медленно работает. Будет считать часов 5 или больше. Может есть способ оптимизировать? или вообще другой способ. Код ниже...
|
| Автор: Keeper89 19.5.2009, 23:27 |
| Посмотрите это: http://www.swissdelphicenter.ch/torry/showcode.php?id=1635 |
| Автор: welt 20.5.2009, 00:23 |
| Keeper89 Видел я этот код. Он в сети повсюду. Но что-то неполучается его грамотно применить. Я выделил линию, а потом к ней доступ по элементам x,y и опять тоже самое - долго, долго считает...... |
| Автор: AntonN 20.5.2009, 00:36 |
| долго потому что Canvas.Pixels[], можно переделать на bitmap.scanline, раз в десять быстрее будет |
| Автор: Keeper89 20.5.2009, 01:00 |
| Посмотрите следующие ссылки по теме Image retrieval: http://en.wikipedia.org/wiki/Image_retrieval http://en.pudn.com/downloads107/ebook/detail442443_en.html Вот то, о чем говорил AntonN: http://www.delphisources.ru/pages/sources/database/2008-year/compare-pictures.html |
| Автор: Crw 20.5.2009, 16:22 |
| 1. Зачем вообще вырезать маленькую картинку если можно сразу сравнивать на большой? 2. Можно для начала сравнивать только верхний ряд пикселей - если не совпал, то смысла продолжать сравнивание нету и переносим начало координат дальше. |
| Автор: Crw 20.5.2009, 19:31 | ||
| Ну это понятно, просто по коду: bPicture - оригинальное изображение mPicture - искомое изображение CMP_Picture - сюда копируется изображение (CopyRect) из bPicture для сравнения с mPicture. Такой подход вообще никуда не годиться. На больших изображений количество таких отрисовок может быть несколько тысяч. А окончание кода это что-то. Вообще совершенно ничего не понятно.
Зачем ищется Lmin если оно нигде не используется? В этом коде k всегда будет равно p (которое вначале равно k). Это такой трюк чтобы усложнить понимание алгоритма? П.С. Только не говорите что это рабочий алгоритм.. |
| Автор: welt 1.6.2009, 18:39 | ||
| Crw Надо было написать как-то так
А потом уже по номеру k вырезать картинку. Что-то я ссылки почитал на статьи, но не смог переделать через scanline |