Как сравнить две картинки??

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.02.2005 (Пт) 16:04

Нуууу, ты ещё FPU вспомни :)

Попробуй поюзать их напрямую (раз), да ещё чтобы твой код не зависел от их наличия в текущем процессоре (два) :) Потом позырь, сколько тактов занимает операция загрузки чего-нибудь длинного, и сравни с 1 тактом команды mov...
Так что данный вариант в данном примере не рассматривался :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.02.2005 (Пт) 18:24

1. В .net-е же ничего напрямую нельзя сделать? Можно только надеяться, что JIT умный и их заюзает.
2. Они, безусловно, быстрее mov, иначе зачем бы их добавляли?


А RtlCompareMemory я уже в третий раз упоминаю...
Изображение

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 19.02.2005 (Сб) 10:36

Уточняю... Нужно посто сравнить две картинки одинакового размера или найти одну картинку в другой тоже?
Накидал простой "bruteforce" поиск и сравнение... Какая силища! :D 2,5 тыс. пикселей в секунду! Ща наковыряю на плюсах... Может кто на АСМе параллельно сбацает ДЛЛку?

ssslash
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 20.01.2005 (Чт) 23:40

Сообщение ssslash » 23.02.2005 (Ср) 16:46

Вот интересный примерчик для поиска абсолютно одинаковых картинок, нашел, кажется, на http://www.planet-source-code.com/. В него только сравнение еще по CRC добавить нада...
Вложения
DupImages (1.0.1).zip
(7.81 Кб) Скачиваний: 135

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 23.02.2005 (Ср) 18:44

А что если опять таки сравнивать по точкам, но не все точки, а по rnd() срванивать, скажем точек 30, если хотя бы одна точка не совпадет, то все, кратинки разные! :roll:
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

ssslash
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 20.01.2005 (Чт) 23:40

Сообщение ssslash » 23.02.2005 (Ср) 19:45

Так-то да, они разные...
а вот если совпадет, это еще не значит, что они одинаковые, скажем фотка с разницей в 5 секунд, где только выражение лица чуть-чуть поменялось или комар на нос сел :)

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 23.02.2005 (Ср) 23:39

Ну...... :roll:
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

DTech
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 20.07.2004 (Вт) 21:25

Сообщение DTech » 24.02.2005 (Чт) 2:01

Если это фотографии - то 30 точек сравнить - более чем достаточно, даже если сравнивать соседние кадры видеопотока, то они будут различаться. Какого характера пиктограммы?

ssslash
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 20.01.2005 (Чт) 23:40

Сообщение ssslash » 24.02.2005 (Чт) 13:22

Так мы одинаковые ищем или похожие? Если одинаковые - то сравнивать размер файла, размер картинки в пикселях и потом по CRC, так, по-моему, и быстрее будет и надежнее, чем каждые 30 точек считать. Может я не прав, не спорю, поправьте :)
Кстати, примерчик, который я выкладывал, никто не смотрел? он по-моему, неоправданно медленно работает, когда с поиском по sub-директориям. Кто по-опытнее, подскажите, плиз, чего там не так...

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 24.02.2005 (Чт) 13:29

Вот ДЛЛка с функцией PicCompare
Если картинки одинаковые возвращает 0 (зеро), если разные - все остальное. Никаких проверок в ней нет, так что исключения надо ловить самостоятельно. :roll:
Код: Выделить всё
    <DllImport("cdll.DLL", EntryPoint:="PicCompare", _
    CharSet:=CharSet.Auto, ExactSpelling:=True, _
    CallingConvention:=CallingConvention.StdCall)> _
    Public Shared Function _
    PicCompare(ByVal SrcHbitmap As IntPtr, _
               ByVal DstHbitmap As IntPtr) As Integer
    End Function


Вызывать примерно так:
Код: Выделить всё
    Private Sub cmdFindASM_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdFindASM.Click
        Dim Dst As New Bitmap(pBoxDst.Image)
        Dim Src As New Bitmap(pBoxSrc.Image)
        Dim ret As Integer

        ret = PicCompare(Src.GetHbitmap, Dst.GetHbitmap)
        If ret = 0 Then
            MsgBox("Ok")
        Else
            MsgBox("Failed")
        End If
    End Sub
Вложения
cdll.rar
__declspec(dllexport) int __stdcall PicCompare(HBITMAP src, HBITMAP dst);
(17.93 Кб) Скачиваний: 97

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 24.02.2005 (Чт) 18:37

Естественно, сообщайте о багах... Что смогу поправлю.

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 25.02.2005 (Пт) 10:31

Куда-то пропал прикрепленный файл... Или я чего-то не понимаю?
Вложения
cdll.rar
__declspec(dllexport) int __stdcall PicCompare(HBITMAP src, HBITMAP dst);
(17.93 Кб) Скачиваний: 90

ssslash
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 20.01.2005 (Чт) 23:40

Сообщение ssslash » 25.02.2005 (Пт) 21:14

"Куда-то пропал прикрепленный файл..."
А это его кто-то выкачал, а назад забыл вернуть :) ...
Будем тестить.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 26.02.2005 (Сб) 0:00

Верните файл взад или вышлете на мыло :-)
P/S а вообще, вначале речь шла о ТОЧНОМ сравнении картинок а не о нахождении похожести.

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 26.02.2005 (Сб) 11:14

Реализовано именно точное сравнение. И довольно быстро работает. :!:
Насчет прикрепленного файла я конечно проглючил, кто бы мог подумать что незалогинившись его не видно... :lol:

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 04.03.2005 (Пт) 18:51

А вот так
Код: Выделить всё
Dim Dst As New Bitmap(pBoxDst.Image)
Dim Src As New Bitmap(pBoxSrc.Image)
Dim bmDst As New System.Drawing.Imaging.BitmapData
Dim bmSrc As New System.Drawing.Imaging.BitmapData
Dim i As Integer
Dim tmp As Integer

bmSrc = Src.LockBits(New Rectangle(0, 0, Src.Width - 1, Src.Height - 1), Imaging.ImageLockMode.ReadOnly, Src.PixelFormat)
bmDst = Dst.LockBits(New Rectangle(0, 0, Dst.Width - 1, Dst.Height - 1), Imaging.ImageLockMode.ReadOnly, Dst.PixelFormat)
'если картинки отличаются по размеру значит они разные
If bmSrc.Width <> bmDst.Width Or bmSrc.Height <> bmDst.Height Then
    MsgBox("Failed")
    Src.UnlockBits(bmSrc)
    Dst.UnlockBits(bmDst)
    Exit Sub
End If
'если у картинок разная "битность" значит они разные
If Src.GetPixelFormatSize(bmSrc.PixelFormat) <> Dst.GetPixelFormatSize(bmDst.PixelFormat) Then
    MsgBox("Failed")
    Src.UnlockBits(bmSrc)
    Dst.UnlockBits(bmDst)
    Exit Sub
End If
'длинна массива данных картинки в байтах
tmp = bmDst.Width * bmDst.Height * Dst.GetPixelFormatSize(bmDst.PixelFormat) / 8
'сравниваем
For i = 0 To tmp - 1
    'как только найдем различие - завершаем
    If Not Marshal.ReadByte(bmDst.Scan0, i) = Marshal.ReadByte(bmSrc.Scan0, i) Then
        MsgBox("Failed")
        Src.UnlockBits(bmSrc)
        Dst.UnlockBits(bmDst)
        Exit Sub
    End If
Next
'различий не обнаружено. вывод: картинки одинаковые
MsgBox("Ok")

Src.UnlockBits(bmSrc)
Dst.UnlockBits(bmDst)

это можно сделать на бейсике.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 04.03.2005 (Пт) 19:32

Ой, и тут биты лочат... Кашшмар :shaking:
Изображение

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 05.03.2005 (Сб) 9:55

Не вижу супротив энтого противопоказатиев! :)
Кстати, если кто не в курсе, о GDI+ неплохо пишут здесь:
http://www.rsdn.ru/article/gdi/gdiplus2mag.xml

Пред.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 74

    TopList