Сейчас на форуме: rmn, exp50848 (+7 невидимых)

 eXeL@B —› Основной форум —› DLL - сравнение 2х битмапов [разбор алгоритма]
Посл.ответ Сообщение


Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 12 октября 2012 13:22 · Поправил: KingSise
· Личное сообщение · #1

Есть дллка, по идеи она должна сравнивать 2 изображения и выдавать процент похожести. В ней всего одна эксвортированная функция:

Address=008D9F30
Section=CODE
Type=Export
Name=CompareBitmaps
Comment=compare 2 Arg


Прототип на Си:

Code:
  1. [DllImport("compare.dll", EntryPoint="CompareBitmaps")]
  2.                  static extern Byte CompareBitmaps(IntPtr Bitmap1, IntPtr Bitmap2);



Проблемко заключается в следующем:

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

начало процедуры:

Code:
  1. 008D9F30 >/$  55            PUSH EBP                                 ; compare 2 Arg
  2. 008D9F31  |.  8BEC          MOV EBP,ESP
  3. 008D9F33  |.  81C4 7CF6FFFF ADD ESP,-984
  4. 008D9F39  |.  53            PUSH EBX
  5. 008D9F3A  |.  56            PUSH ESI
  6. 008D9F3B  |.  57            PUSH EDI
  7. 008D9F3C  |.  C645 FF FF    MOV BYTE PTR SS:[EBP-1],0FF
  8. 008D9F40 >|.  E8 4F8CFEFF   <b>CALL compare.008C2B94</b>



Инициализация генератора, не?
Code:
  1. 008C2B94  /$  83C4 F8       ADD ESP,-8
  2. 008C2B97  |.  54            PUSH ESP                                 ; /pPerformanceCount
  3. 008C2B98  |.  E8 F3E6FFFF   CALL <JMP.&kernel32.QueryPerformanceCoun>; \QueryPerformanceCounter
  4. 008C2B9D  |.  85C0          TEST EAX,EAX
  5. 008C2B9F  |.  74 0B         JE SHORT compare.008C2BAC
  6. 008C2BA1  |.  8B0424        MOV EAX,DWORD PTR SS:[ESP]
  7. 008C2BA4  |.  A3 08B08D00   MOV DWORD PTR DS:[8DB008],EAX
  8. 008C2BA9  |.  59            POP ECX
  9. 008C2BAA  |.  5A            POP EDX
  10. 008C2BAB  |.  C3            RETN
  11. 008C2BAC  |>  E8 E7E6FFFF   CALL <JMP.&kernel32.GetTickCount>        ; [GetTickCount
  12. 008C2BB1  |.  A3 08B08D00   MOV DWORD PTR DS:[8DB008],EAX
  13. 008C2BB6  |.  59            POP ECX
  14. 008C2BB7  |.  5A            POP EDX
  15. 008C2BB8  \.  C3            RETN


и еще:
начало процедуры:
008D9590 /$ 55 PUSH EBP

вызывается 2 раза, там видно, что с битмапами она все же что то делает...



И в самом конце основной процедуры:

Code:
  1. 008DAD71  |> \B8 FF000000   MOV EAX,0FF
  2. 008DAD76  |.  E8 A97FFEFF   CALL compare.008C2D24                    ; WTF? &#9786;


Ненератор случайного байта... Мля...вот его и возвращает функция...
Code:
  1. 008C2D24 /$  53            PUSH EBX
  2. 008C2D25  |.  31DB          XOR EBX,EBX
  3. 008C2D27  |.  6993 08B08D00>IMUL EDX,DWORD PTR DS:[EBX+8DB008],80884>
  4. 008C2D31  |.  42            INC EDX
  5. 008C2D32  |.  8993 08B08D00 MOV DWORD PTR DS:[EBX+8DB008],EDX
  6. 008C2D38  |.  F7E2          MUL EDX
  7. 008C2D3A  |.  89D0          MOV EAX,EDX
  8. 008C2D3C  |.  5B            POP EBX
  9. 008C2D3D  \.  C3            RETN


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

З.ы. дллка полезная, в хозяйстве может пригодиться ☺




c90f_12.10.2012_EXELAB.rU.tgz - compare.rar

-----
-=истина где-то рядом=-




Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 12 октября 2012 14:19
· Личное сообщение · #2

Там дельфи соответсвенно в IDR можно засунуть.



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 12 октября 2012 14:27
· Личное сообщение · #3

Сдается мне что она ничего полезного из себя не представляет.
Последняя расчитанная переменная [ebp+var_20] записывается здесь
Code:
  1. CODE:0041AD1E                 fstp    [ebp+var_20]
  2. CODE:0041AD21                 wait
  3. CODE:0041AD22                 jmp     short loc_41AD2C
  4. CODE:0041AD24 ; ---------------------------------------------------------------------------
  5. CODE:0041AD24
  6. CODE:0041AD24 loc_41AD24:                             ; CODE XREF: CompareBitmaps+DD5j
  7. CODE:0041AD24                                         ; CompareBitmaps+DE3j
  8. CODE:0041AD24                 xor     eax, eax
  9. CODE:0041AD26                 mov     dword ptr [ebp+var_20], eax
  10. CODE:0041AD29                 mov     dword ptr [ebp+var_20+4], eax

можешь попробовать ее как результат брать




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 12 октября 2012 14:33 · Поправил: ClockMan
· Личное сообщение · #4

KingSise пишет:
З.ы. дллка полезная, в хозяйстве может пригодиться ☺

капчу сравнивать
--> Сравнение двух bmp картинок одинакового размера <--

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 12 октября 2012 14:59 · Поправил: vden
· Личное сообщение · #5

Судя по экспорту, оригинальное название project_dll.dll

Написана видимо на D7.

char __stdcall CompareBitmaps(HBITMAP a1, HBITMAP a2)

Функция чего-то творит с битмапами, применяет один из доступных фильтров

Code:
  1. enum TFilterKind
  2. {
  3.   FILTER_BOX = 0x0,
  4.   FILTER_TRIANGLE = 0x1, // использует этот
  5.   FILTER_HERMITE = 0x2,
  6.   FILTER_BELL = 0x3,
  7.   FILTER_BSPLINE = 0x4,
  8.   FILTER_LANCZOS3 = 0x5,
  9.   FILTER_MITCHELL = 0x6,
  10. };


массив фильтров
Code:
  1. DATA:0041B6B8 g_Filters       TFilterDesc <offset aBox, offset BoxFilter, 0.5>
  2. DATA:0041B6B8                 TFilterDesc <offset aTriangle, offset TriangleFilter, 1.0> ; "Box"
  3. DATA:0041B6B8                 TFilterDesc <offset aHermite, offset HermiteFilter, 1.0>
  4. DATA:0041B6B8                 TFilterDesc <offset aBell, offset BellFilter, 1.5>
  5. DATA:0041B6B8                 TFilterDesc <offset aBSpline, offset BSplineFilter, 2.0>
  6. DATA:0041B6B8                 TFilterDesc <offset aLanczos3, offset Lanczos3Filter, 3.0>
  7. DATA:0041B6B8                 TFilterDesc <offset aMitchell, offset MitchellFilter, 2.0>


Если не ошибаюсь результат фильтра как-то сводится к битмапу 16x16.

Вот здесь финальное сравнение:

Code:
  1. CODE:0041AD2C                 cmp     bx, 64h
  2. CODE:0041AD30                 jnz     short loc_41AD71
  3. CODE:0041AD32                 mov     [ebp+SomeCompareResult], 1
  4. CODE:0041AD39                 mov     [ebp+x], 100h
  5. CODE:0041AD43                 lea     esi, [ebp+var_558]
  6. CODE:0041AD49                 lea     eax, [ebp+var_958]
  7. CODE:0041AD4F
  8. CODE:0041AD4F loc_41AD4F:                             ; CODE XREF: CompareBitmaps+E38j
  9. CODE:0041AD4F                 mov     edx, [esi]
  10. CODE:0041AD51                 cmp     edx, [eax]
  11. CODE:0041AD53                 jz      short loc_41AD5C
  12. CODE:0041AD55                 mov     [ebp+SomeCompareResult], 0
  13. CODE:0041AD5C
  14. CODE:0041AD5C loc_41AD5C:                             ; CODE XREF: CompareBitmaps+E23j
  15. CODE:0041AD5C                 add     eax, 4
  16. CODE:0041AD5F                 add     esi, 4
  17. CODE:0041AD62                 dec     [ebp+x]
  18. CODE:0041AD68                 jnz     short loc_41AD4F
  19. CODE:0041AD6A                 cmp     [ebp+SomeCompareResult], 0
  20. CODE:0041AD71
  21. CODE:0041AD71 loc_41AD71:                             ; CODE XREF: CompareBitmaps+E00j
  22. CODE:0041AD71                 mov     eax, 0FFh
  23. CODE:0041AD76                 call    Random          ; BDS 2005-2007 and Delphi6-7 Visual Component Library


Результат которого не используется.

В итоге выдаётся -1 либо Random(255).

Может быть библиотека не закончена.

Если интересно, вот база.

| Сообщение посчитали полезным: maxic9


Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 12 октября 2012 15:43 · Поправил: KingSise
· Личное сообщение · #6

vden пишет:
Может быть библиотека не закончена.


Однозначно Ибо можно было бы call Random в самом начале вставить... Ну а тут...

vden, как думаешь, докодить недостающую часть реально?

ClockMan пишет:
капчу сравнивать

Как вариант

-----
-=истина где-то рядом=-




Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 12 октября 2012 16:14 · Поправил: vden
· Личное сообщение · #7

KingSise пишет:
докодить недостающую часть реально?


Вот патч, чтобы выдавал результат последнего сравнения

Но там же ещё на точке входа задаются какие-то параметры, и нет возможности выбирать фильтры.
Так что это скорее всего работать будет плохо.

Проще наверно написать заново нормально. По крайней мере сможешь контролировать свои алгоритмы.




Ранг: 469.0 (мудрец), 100thx
Активность: 0.250
Статус: Участник
[www.AHTeam.org]

Создано: 14 октября 2012 18:35
· Личное сообщение · #8

vden пишет:
Так что это скорее всего работать будет плохо.

Или вообще не будет работать ;) При первом вызове процедуры будет всегда 0, при повторном (картинки те же) всегда 1

vden пишет:
Проще наверно написать заново нормально.

Ну не знаю, мне не проще, я например, даже теорию не знаю, как сравнить 2 жопега разного разрешения и притом одна жопега - черно-белая...

-----
-=истина где-то рядом=-


| Сообщение посчитали полезным: Salabasama

Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 14 октября 2012 18:45
· Личное сообщение · #9

KingSise
Возьмите лучше OpenCV, есть порты с с/с++ на другие языки в том числе дот нет.



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 13 ноября 2012 12:04
· Личное сообщение · #10

добавил благодарность vden-у
Молодец, ближе всех к правде

На правах автора этой dll-ки - демо-вариант не получится использовать - там закомментарена последняя строчка в исходнике, в которой нехилые такие вычисления, да еще и с использованием нецелой константы, которую подобрать нереально, не зная алгоритма.


 eXeL@B —› Основной форум —› DLL - сравнение 2х битмапов [разбор алгоритма]
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати