Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрое сравнение изображений 
V
    Опции темы
mr.Anderson
Дата 16.7.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Я прописал в программе алгоритм сравнения двух изображений, основанный на переборе и сравнении цвета всех пикселов по порядку первой и второй картинки. Он работает прекрасно, вот только очень медленно, особенно если изображения разрешением по 4-5 тысяч пикселов по ширине и высоте. Можно ли как-то ускорить эту работу? Может, есть более быстрый метод сравнения?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Snowy
Дата 16.7.2007, 23:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Зависит от того, как сравниваешь.
Если через Pixels, то это самый медленный вариант.
Если через ScanLines, то это гораздо быстрее.
Ну а ещё быстрее - через DIB
PM MAIL   Вверх
mr.Anderson
Дата 17.7.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Я и не знал, что ScanLine можно сравнивать. smile Спасибо!


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 17.7.2007, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



  Еще быстрее если это изначально файлы, тогда не нужнf будет конвертировать Bitmap->DIB


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mr.Anderson
Дата 17.7.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Alexeis, а это могут быть и не файлы?

Сделал через ScanLine, все работает раз в 100 быстрее. smile Класс.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 17.7.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(mr.Anderson @  17.7.2007,  13:08 Найти цитируемый пост)
а это могут быть и не файлы?

  Конечно! Можно их динамически в памяти создавать, грузить из ресурсов, распаковывать из сжатого потока, скачивать из интернета или получать от неизвестного заранее источника.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mr.Anderson
Дата 17.7.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



А. Нет, в моем случае файлы.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 17.7.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Цитата(mr.Anderson @  17.7.2007,  14:25 Найти цитируемый пост)
А. Нет, в моем случае файлы. 

 Тогда максимального быстродействия можно было бы добиться если сначала прочитать заголовки битмапов прям из файла. Если они отличаются, то вообще нет смысла сравнивать битовые карты, если совпадают, то читать строки прям из файла и сравнивать. При использовании Scanline все же производиться двойное преобразование, но если скорость уже достаточная, то можно и не возиться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 17.7.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



Alexeis, а если тупо сравнить содержимое файлов в бинарном виде? )))


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 17.7.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 17.7.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



А если png?
А если нужно вычислить процент различия, например для jpeg?
Ведь далеко не факт, что это будут bmp.
Мона гадать по разному - ответ зависит от вопроса.
PM MAIL   Вверх
mr.Anderson
Дата 17.7.2007, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Моя программа поддерживает только BMP и JPEG ввиду отсутствия компонентов для работы с GIF и PNG. Вообще, назначение - поиск эквивалентов эталонной фотографии в заданной папке. Проблема в том, что она очень ресурсоемкая, то есть после 1-2 применений поиска по большим фотографиям размером 1-2 мегабайта комп буквально с ума сходить начинает и отказывается работать, хотя комп по сегодняшним меркам средний.

Я присоединил файл с исходниками программы, может, кто поможет найти причину такой сильной траты памяти? Программа небольшая, весь код в 200 строк примерно.

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Equal_Images_Finder.rar 16,86 Kb


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 17.7.2007, 20:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



mr.Anderson а уничтожать битмапники кто будет?
Код

function IsEqual( OP1, OP2: TJPEGImage ): Boolean; overload;
var
 I1, I2 : TBitmap;
begin
 //сравниваем размеры
 if( OP1.Width <> OP2.Width ) or ( OP1.Height <> OP2.Height ) then
 begin
  Result := False;
  Exit;
 end; //end if

 //если размеры одинаковы, переводим в Bitmap и сравниваем
 I1 := TBitmap.Create();
 I2 := TBitmap.Create();
 I1.Assign( OP1 );
 I2.Assign( OP2 );
 Result := IsEqual( I1, I2 ); //вызываем другой перегруженный вариант
end;


создать создал а удалить не удалил.

Аналогично тут
Код

function IsEqual( OP1: TBitmap; OP2: TJPEGImage ): Boolean; overload;
var
 img : TBitmap;
begin
 //сравниваем размеры
 if( OP1.Width <> OP2.Width ) or ( OP1.Height <> OP2.Height ) then
 begin
  Result := False;
  Exit;
 end; //end if

 //если размеры одинаковы, переводим в Bitmap и сравниваем
 img := TBitmap.Create();
 img.Assign( OP2 );
 Result := IsEqual( OP1, img ); //вызываем другой перегруженный вариант
end;


 smile Я вообще не нашел ни одного вызова Free. Ты что под .NET пишешь?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mr.Anderson
Дата 17.7.2007, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: 3
Всего: 128



Цитата
Ты что под .NET пишешь

Нет, но потихоньку привыкаю.  smile Спасибо за подсказку! Я, правда, думал, что эти битмапы будут уничтожаться после выхода из функции как локальные переменные. Разве это не так?

Вставил где надо Free() и комп перестал виснуть. smile Работает отлично при любом количестве вызовов.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 17.7.2007, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Объекты в делфи всегда создаются в куче в отличие от С++, потому их нужно удалять. 
 Однако компоненты чаще всего уничтожает родитель потому их не нужно явно удалять.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.