Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2010, 20:00   #1
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию Простая задача на сравнение картинок

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

В общем на форме есть 2 компонента timage. в один из них загружается заранее известное изображение в формате bmp,во втором окошке ТАКОГО - же размера мелькают другие изображения, в формате bmp и такой - же цветовой палитре (чернобелые), требуется остановить это, когда картинки в двух timmage совпадут 100%

ПС в идеальном варианте, изображения должны совпадать не полностью, а ~ на 85 - 98 % (это на случай сглаживания на другом компьютере)

PSS вообще передо мной стояла задача найти в одном изображении другое, заранее известное. Тоесть была картинка 60*760 и в ней необходимо найти заранее известную 60*20 и определить высоту этой маленькой картинки относительно верхнего левого угла большой.

отрывок кода:
Код:
procedure TForm1.Button11Click(Sender: TObject);
var
  bmp: TBitmap;
  bool:integer;
  P1,P2 : PByteArray;
  i22,t22,razvY : integer;
begin
  StatusBar1.SimpleText := 'определяем высоту разведзонда';
  razvY:=0;

REPEAT
  Label1.Caption:=IntToStr(165+razvY);
  bmp := TBitmap.Create;
  bmp.Width := 60;
  bmp.Height := 20;
  BitBlt(bmp.Canvas.Handle, 0,0, 60, 20, GetDC(form1.Handle), 178,165+razvY,SRCCOPY); 
  Image.Width := 60;
  Image.Height := 20;
  Image.Picture.Assign(bmp);
  Threshold(Image.Picture.Bitmap, 140, clWhite, clBlack);{функция перевода изображений в чернобелое}
  bmp.Free;
  razvY:=razvY+1;

  if razvY = 350 then {на случай если картинка так и не была найдена, чтоб небыло зацикливания}
    begin
      StatusBar1.SimpleText := 'разведзонды не обнаружены ;(';
      Break;
    end;

  bool:=1;

{сравнение изображений}
  for i22:=0 to image.Picture.Bitmap.Height-1 do
  begin
  P1:=image.Picture.Bitmap.ScanLine[i22];
  P2:=image2.Picture.Bitmap.ScanLine[i22];
  for t22:=0 to (image.Picture.Bitmap.Width*3)-1 do
  if P1[t22]<>P2[t22] then bool:=0 ; exit; end;
end;

bool:=bool*2;

until bool > 2;



      StatusBar1.SimpleText := 'высота разведзонда '+label1.Caption;


end;
Пояснение по коду:
Обе картинки переводятся в чернобелый цвет, правая картинка помещается в один компонент ТИММАДЖ(первый), отрывок левой помещается во второй компонент, проверяется на совпадение, если их нет, то во втрой тиммадж запихивается кусочек на 1 пиксель ниже предидущего и так примерно 700 раз, пока не переберутся все возможные кусочки и не будет найден искомый.

Однако ничего из этого не выходит.... даже когда в т иммоджах одинаковые изображения, цикл не прерывается.. (это когда с таймером делал), после переделал без него, с циклом постусловия REPEAT. Но он почему - то выполняется только раз...

Очунь жду ответа
Изображения
Тип файла: jpg Безымянный.jpg (36.8 Кб, 335 просмотров)

Последний раз редактировалось stlcrash; 04.07.2010 в 20:18.
stlcrash вне форума Ответить с цитированием
Старый 05.07.2010, 12:16   #2
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Смотри пример во вложении.
Вложения
Тип файла: zip FindImg.zip (3.1 Кб, 259 просмотров)
x128 вне форума Ответить с цитированием
Старый 06.07.2010, 13:57   #3
stlcrash
Форумчанин
 
Регистрация: 04.07.2010
Сообщений: 131
По умолчанию

Спасибо за ответ, тему можно закрывать.
PS я по другому чуток сделал, сначала перевёл сравниваемую картинку в чернобелую и "протащил её с верху в низ" сравнивая с эталоном по количеству совпавших черных и белых пикселей, потом там, где среднее арифметическое было самым большим, там и находится картинка, высоту из этого вытащить было не сложно, если кого интересует, могу свой исходник скинуть : )
stlcrash вне форума Ответить с цитированием
Старый 19.07.2010, 00:25   #4
jone
Форумчанин
 
Аватар для jone
 
Регистрация: 27.09.2008
Сообщений: 152
По умолчанию

Почему вложение не качается?
jone вне форума Ответить с цитированием
Старый 22.07.2010, 14:49   #5
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,534
По умолчанию

Цитата:
Сообщение от jone Посмотреть сообщение
Почему вложение не качается?
качайте. файл на месте. и на будущее. с такими вопросами нужно обращться в личку ко мне.
Alar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение картинок Crucian Общие вопросы Delphi 8 01.11.2010 05:13
Сравнение картинок Astron Мультимедиа в Delphi 16 29.04.2010 02:22
Не простая задача !!! MaxZoa Microsoft Office Excel 2 06.03.2008 18:07
Сравнение картинок bloood Общие вопросы C/C++ 1 30.03.2007 15:54