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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 03:18   #11
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Что вы подразумеваете под ошибкой? EAccessViolation?
Скомпилировал код в Delphi 7, TDLite Delphi 2006, Delphi Rad Studio 2010.
Все 3 сказали, что картинки различны.
Код:
var
  s, f: tmemorystream;
begin
  s := TmemoryStream.create;
  f := TmemoryStream.create;
  s.LoadFromFile('1.bmp');
  f.LoadFromFile('9b.bmp');
  if s.Size = f.Size then
    if comparemem(s.memory, f.memory, s.size) then
      showmessage('ok')
    else
      showmessage('different');
  s.free;
  f.free;
end;
[offtop]Смотрю, вы пишите бота для игры в карты)[/offtop]
Посмотрите пожалуйста весь код моей программы, по идеи картинка должна быть одинаковой а она почему то разная

[offtop]Смотрю, вы пишите бота для игры в карты)[/offtop]
Помощника , компьютер все таки быстрее и точнее подсчитает шанс моей руки

Последний раз редактировалось ClMlD; 30.04.2012 в 03:22.
ClMlD вне форума Ответить с цитированием
Старый 30.04.2012, 07:44   #12
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вам что нужно сравнивать, файлы или картинки?
Если картинки, то побайтовое сравнение - далеко не лучшая идея, т.к. полностью идентичным картинкам могут соответствовать файлы, существенно различающиеся как по размеру, так и по содержимому.
s-andriano вне форума Ответить с цитированием
Старый 30.04.2012, 08:23   #13
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Вам что нужно сравнивать, файлы или картинки?
Если картинки, то побайтовое сравнение - далеко не лучшая идея, т.к. полностью идентичным картинкам могут соответствовать файлы, существенно различающиеся как по размеру, так и по содержимому.
Сравнивать нужно картинки , как будет лучше распознать что на столе лежит

Да и кстати когда я создавал базу карт я делал скриншоты рандомно то есть где появиться карта там и делаю скриншот к примеру для флопа будет 3 места где будут появляться карты вот с этих 3 мест я и делал скриншоты
Может я делал скриншот с места 1 а проверяю карту на втором или третьем месте поэтому и не сходиться
ClMlD вне форума Ответить с цитированием
Старый 30.04.2012, 09:32   #14
=master=
Форумчанин
 
Регистрация: 26.03.2012
Сообщений: 665
По умолчанию

Тут до сравнения еще надо все переделать.
1. Убрать глобальные переменные, сделать вместо них скрытые поля формы.
2. Убрать инициализацию массива card из метода таймера, сделать это на старте (при создании формы или еще куда..)
3. Собстекнно не понятно, в чем глубокий смысл использования таймера?
4. Нет проверки, входит ли i в заданный диапозон.
5. Имена файлов карт вынести из кода, в файл, грузить опять таки на старте в какой-нибудь стринглист, а массив выкинуть.
....
ну вот для начала...
=master= вне форума Ответить с цитированием
Старый 30.04.2012, 10:12   #15
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

WinHex`oм сравнил 1 и 9b. Оказалось, что по адресу 5515 лежат 2 разных шестнадцатеричных числа: в "1" 47, а в "9b" 4C. И все из-за одного байта.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 30.04.2012, 10:21   #16
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
WinHex`oм сравнил 1 и 9b. Оказалось, что по адресу 5515 лежат 2 разных шестнадцатеричных числа: в "1" 47, а в "9b" 4C. И все из-за одного байта.
Во как , а почему так может быть наверное оттенок какой то ? Это можно как нибудь обойти?
ClMlD вне форума Ответить с цитированием
Старый 30.04.2012, 11:03   #17
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
Во как , а почему так может быть наверное оттенок какой то ?
Что-то типа того.
Цитата:
Это можно как нибудь обойти?
С TMemoryStream можно работать как с файлом. Думаю, что лучше делать побайтное сравнение, ибо у вас картинки одинакового размера и созданы тоже одним и тем же способом(а значит BMPINFOHEADER одинаковые).
Если различий будет M, то картинки одинаковы. Если их будет N или больше,то они разные.
N Вам нужно будет вычислить экспериментально.
Размеры картинки вам и не нужно сравнивать, они будут одного и того же размера, раз вы режете по одному и тому же алгоритму.
Вот приблизительно такой код:
Код:
var i,end1,different:integer;
c1,c2:char;
........
  MS1:=TMemoryStream.Create;
  MS2:=TMemoryStream.Create;
  ms1.LoadFromFile('C:\1.bmp');
  ms2.LoadFromFile('C:\9b.bmp');
  ms1.Position:=0;
  ms2.Position:=0;
  end1:=ms1.Size;
  different:=0;
  for i:= 1 to end1-1 do
  begin
    ms1.Read(c1,1);
    ms2.Read(c2,1);
    if c1<>c2 then sifferent:=defferent+1;
  end;
    if different>N then showmessage('различны');// N рассчитайте экспериментально
Если помог, проси поставить минус. Будь оригинален!

Последний раз редактировалось Rin; 30.04.2012 в 11:11.
Rin вне форума Ответить с цитированием
Старый 30.04.2012, 12:22   #18
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Rin Спасибо большое вроде всё получилось после исправления синтаксических ошибок в коде.

Я правельно понял ? вот наши два файла 1.bmp 9b.bmp как вы сказали разница между ними всего 1байт , в вашем коде я присвоил n:= 1 и файлы стали равны то есть N = число отсеянных ошибок (не совпадений) если увеличить N то и увеличится число допустимых различий я правильно все понял?

Чутка изменил:
Код:
var
   Form1: TForm1;
 i,end1,different,n:integer;
 c1,c2:char;
 ms1, ms2 : Tmemorystream;
  begin
  MS1:=TMemoryStream.Create;
  MS2:=TMemoryStream.Create;
  ms1.LoadFromFile('C:\1.bmp');
  ms2.LoadFromFile('C:\9b.bmp');
  ms1.Position:=0;
  ms2.Position:=0;
  end1:=ms1.Size;
  different:=0;
  n:=1;
  for i:= 1 to end1-1 do
  begin
    ms1.Read(c1,1);
    ms2.Read(c2,1);
    if c1<>c2 then different:=different+1;
  end;
    if different>N then
    showmessage('различны')// N рассчитайте экспериментально
    else
    showmessage('Равны');
end;
end.
Что бы себя убедить в работоспособности кода заменил 9b.bmp на 9k.bmp сказал файлы разные , в целом проблема решена всем спасибо большое за помощь и внимание , очень помогли.
Тему прошу пока не закрывать, буду делать полный тест вдруг опять что получиться не так
ClMlD вне форума Ответить с цитированием
Старый 30.04.2012, 12:37   #19
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Цитата:
Я правельно понял ? вот наши два файла 1.bmp 9b.bmp как вы сказали разница между ними всего 1байт , в вашем коде я присвоил n:= 1 и файлы стали равны то есть N = число отсеянных ошибок (не совпадений) если увеличить N то и увеличится число допустимых различий я правильно все понял?
Да.
Кстати, а зачем 52 картинки? Можно же воспользоваться 4масти+13 красных+13 черных.
Копируем масть и значение карты(2,3,..,10,..,К,Т). Сравниваем вышеприведённым алгоритмом масть. Если черви или бубны, то дальше просматриваем 13 красных. Если крести или пики, то дальше просматриваем 13 черных.
В 3 раза меньше сравнений будет, то есть 4+13.
А раз сравнений файлов меньше, то и алгоритм быстрее.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 30.04.2012, 13:37   #20
ClMlD
Форумчанин
 
Аватар для ClMlD
 
Регистрация: 09.07.2011
Сообщений: 185
По умолчанию

Если я правильно понял то придется скриншотить две области на одной карте
1 - Это значение карты
2 - Это масть
Тем самым как вы сказали увеличиться скорость сравнения картинок
И уменьшиться база с картами (В Количестве)

Но как тогда их подставлять в переменную для сканирования по очереди придется же добавлять два значения
Я слышал что то о двумерных массивах наверное это понадобиться?

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файлов формата bmp по заданным параметрам LinaSh Помощь студентам 17 18.04.2011 21:08
XOR двух bmp Pavel_S Мультимедиа в Delphi 4 05.03.2011 07:53
Преобразование bmp файлов Lerank Помощь студентам 2 21.09.2010 12:15
Сравнивание ячеек двух таблиц Rainkhz Общие вопросы Delphi 2 29.05.2010 19:16