Оптимизация сравнения двух изображений

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Оптимизация сравнения двух изображений

Сообщение olegy123 » 24.04.2019 15:35:29

инструкции MMX/SSE/AVX заточены на скоростные выполнение с векторами(массивами чисел)


sts писал(а):могу посоветовать для StretchDraw (если винда) использовать GDI+ под старую винду или Direct2D, они, при возможности используют аппаратное ускорение.

тут есть свои минусы - как правило копирование в аппарат, выставление программы, режима, работа тоже занимает время и выгрузка результата.
olegy123
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 25.02.2016 12:10:20

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 24.04.2019 15:53:29

sts писал(а):забавно что алгоритм автора наименее ресурсоемкий ну и подслеповатый, любой другой будет на порядок дороже но и более правильный. могу посоветовать для StretchDraw (если винда) использовать GDI+ под старую винду или Direct2D, они, при возможности используют аппаратное ускорение.

Извини не понял "алгоритм автора" это про алгоритм ТС или мой?
StretchDraw применяю регулярно но в данном случае это неприменимо по причине дополнительного и по идее очень не быстрого действия ( тут olegy123 совершено прав ! )... (Фокус CompareByte в том что он останавливается при первом же не соответствии (причем сравнение идет сразу сначала и конца массива ) что в случае маловероятного случайного спадения происходит мгновенно, то есть на ожидание образца времени не тратится совсем )

Добавлено спустя 10 минут 26 секунд:
Лекс Айрин писал(а):...

По утилите для WMR тоже оффтоп хотя и менее злостный так что если интересно о ней спорить дальше, читай мой ответ уже ТУТ
Последний раз редактировалось Alex2013 25.04.2019 04:12:09, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 1377
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение sts » 24.04.2019 18:09:13

я про ТС
sts
постоялец
 
Сообщения: 267
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 25.04.2019 05:10:02

sts писал(а):я про ТС

У ТС заведомо нереальный тормоз Сanvas.Piхеls[...] страшнее атомной войны..
(Уж поверь тому кто целую "Лаборатории распознавания образов" через Сanvas.Piхеls в 2015 году пытался писать ...) :wink:

ИзображениеИзображение

:arrow: Nv_BETA003.zip
Для сравнения "другой технологический уровень " через пару лет...
https://youtu.be/ti13V4hxPIQ ( Тут я еще не научился видео с экрана писать поэтому чистота кадров этого ролика низковата зато на "трубе" )

https://drive.google.com/uc?export=open&confirm=no_antivirus&id=1GjxRufy1HJjSnykQqLI5vpp5O0o9HN9o
https://drive.google.com/uc?export=open ... tJi-8xb0cQ (Тут гифка чуть побольше )
Суть показа достигнутой возможности работы с живым видео в "реальном времени" (или рядом )
Скорость на 2-3 порядка выше чем можно получить через Сanvas.Piхеls...
Последний раз редактировалось Alex2013 26.04.2019 17:42:23, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 1377
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение sts » 25.04.2019 09:52:40

и? как это противоречит тому что я написал?
sts
постоялец
 
Сообщения: 267
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 25.04.2019 17:13:18

sts писал(а):и? как это противоречит тому что я написал?

sts писал(а):наименее ресурсоемкий ну и подслеповатый, любой другой будет на порядок дороже

Это где он "наименее ресурсоемкий" ? (Возможно я опять что-то не понял ... но мой вариант (без проверок) одна строчка кода + быстрый доступ и не совсем тупое сравнение ( насколько я понял CompareBayte останавливает сравнение при первом же несоответствии )
Последний раз редактировалось Alex2013 25.04.2019 19:08:07, всего редактировалось 2 раз(а).
Alex2013
энтузиаст
 
Сообщения: 1377
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 25.04.2019 17:20:12

Alex2013, а что за этой строчкой? Там же может быть целая телега текста, подцепленная куча левых модулей и макаронные переходы.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 25.04.2019 17:34:07

Лекс Айрин писал(а):Alex2013, а что за этой строчкой? Там же может быть целая телега текста, подцепленная куча левых модулей и макаронные переходы.

Вот не верующий Фома! Копнуть самостоятельно "нет судьбы" ? :wink: Не хочешь быть помощником "расхитительницы гробниц"? - ну так и быть я за него! :idea:
Код: Выделить всё
function CompareByte(Const buf1,buf2;len:SizeInt):SizeInt; assembler; nostackframe;
{ win64: rcx buf, rdx buf, r8 len
  linux: rdi buf, rsi buf, rdx len }
asm
{$ifndef win64}
    mov    %rdx, %r8
    mov    %rsi, %rdx
    mov    %rdi, %rcx
{$endif win64}
    testq   %r8,%r8
    je      .LCmpbyteZero

    .balign 8
.LCmpbyteLoop:
    movb    (%rcx),%r9b
    cmpb    (%rdx),%r9b
    leaq    1(%rcx),%rcx
    leaq    1(%rdx),%rdx
    jne     .LCmpbyteExitFast
    decq    %r8
    jne     .LCmpbyteLoop
.LCmpbyteExitFast:
     movzbq  -1(%rdx),%r8     { Compare last position }
     movzbq  %r9b,%rax
     subq    %r8,%rax
     ret

.LCmpbyteZero:
     movq    $0,%rax
     ret
   end;     
Alex2013
энтузиаст
 
Сообщения: 1377
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение sts » 25.04.2019 17:57:02

Alex2013 писал(а):Это где он "наименее ресурсоемкий" ? (Возможно я оять что-то не понял ... но мой вариант (без проверок) одна строчка кода + быстрый доступ и не совсем тупое сравнение ( насколько я понял CompareBayte останавливает сравнение при первом же несоответствии )

вариант с CompareByte вообще не имеет отношения к решаемой задаче, остановка при любом не соответствии не нужна, нужно чтоб игнорировался шум матрицы, естественный перепад освещенности, разовые помехи (если камера с аналоговым трактом, или как там это называется), StretchDraw как раз решает эти задачи хоть и не так хорошо как хотелось бы, а полноценные алгоритмы, по ресурсоемкости, эквивалентны десяткам тысяч вызовов StretchDraw на кадр, теже нейросети.
sts
постоялец
 
Сообщения: 267
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Оптимизация сравнения двух изображений

Сообщение Лекс Айрин » 25.04.2019 19:02:26

Alex2013, конечно. Любой программист, который захочет писать более-менее нормальный код будет неверующим Фомой. Просто ты никогда не говори, что решаешь что-то одной строчкой, если ты используешь вызов подпрограммы. А посмотреть я действительно не могу. Я тогда был на улице, так что просто не мог глянуть при всем желании. Физически.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 25.04.2019 20:25:24

sts писал(а):вариант с CompareByte вообще не имеет отношения к решаемой задаче, остановка при любом не соответствии не нужна

В шапке темы стоит " Оптимизация сравнения двух изображений" и я поднял ее как раз как источник методов сравнения двух изображений возможно у ТС стаяла несколько иная задача но мой CompareBMP подходит к заголовку темы на 100%. Что до сравнения образов изображения то есть довольно быстрый "морфологический анализ" ( кстати его используют как одни из методов для анализа изображений в WMR )
Изображение
Изображение
Изображение

Первая картинка как раз "морфология" и это совсем не нейросеть ...
Кстати вот моя моя попытка реализации... :idea:
:arrow: Morphological001.7z
ИзображениеИзображение
( ...наверное в первый раз так удачно параметры настроил - и совершенно не тормозит )

Что до более сложных методик до того как "начинать грызть баобабы" эмуляции нейросетей стоит что-то попроще попробовать например "Каскады Хаара"
:arrow: FaceDetect002.7z
ИзображениеИзображение
(Теперь даже робот не пройдет мимо девушки с обложки .... :wink: )
Последний раз редактировалось Alex2013 26.04.2019 18:17:42, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 1377
Зарегистрирован: 03.04.2013 11:59:44

Re: Оптимизация сравнения двух изображений

Сообщение sts » 26.04.2019 09:16:35

Вы реагируете на форму а надо на содержание, не делайте так это неправильно.
В исходной задаче четко сказано о сравнение изображений с камеры для обнаружения движения.
sts
постоялец
 
Сообщения: 267
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 26.04.2019 17:27:00

Для обнаружения движения есть множество быстрых и простых способов.
На пример вот одно из моих "коронных" :wink: решений "в лоб".... сделано очень примитивно и неоптимально.
Но в простейшем случае работает . (Хотя в данном случае нет поиска нескольких движущихся объектов но абстрактное движение "вообще" вполне ловит и выделяет в рамку )
Изображение
(Видимый "тормоз" просто низкая частота кадров при записи гифа в реальности все работает быстрее и по ощущениям вообще без задержки )

Код: Выделить всё
Function FastCompBW(C:Byte;Var R:TRect; Bitmap,B: TBitmap):bool;
// Сравнение двух кадров (ЧБ вариант)
Type
RGB1=Record  R,G,B  : byte; end;
Const
  DT:Boolean=false;
var
  MinX, MinY: Integer;
  MaxX, MaxY: Integer;
  X,Y: Integer;
  PixelPtr,PixelPtr2: PInteger;
  PixelRowPtr,PixelRowPtr2: PInteger;
  BytePerPixel: Integer;
BW,BW2:Byte;
PRGB,PRGB2:^RGB1;
  begin
  try
    Bitmap.BeginUpdate(False);
    Result:=False;
    //RawImage := Bitmap.RawImage;
    PixelRowPtr := PInteger(Bitmap.RawImage.Data);
    PixelRowPtr2 := PInteger(B.RawImage.Data);
    BytePerPixel := Bitmap.RawImage.Description.BitsPerPixel div 8;
    minX:= Bitmap.Width; MaxX:=0;
    minY:= Bitmap.Height; MaxY:=0;

    for Y := 0 to Bitmap.Height - 1 do begin
      PixelPtr := PixelRowPtr;
      PixelPtr2 := PixelRowPtr2;
      for X := 0 to Bitmap.Width - 1 do begin
       PRGB :=Pointer(PixelPtr);
       PRGB2:=Pointer(PixelPtr2);

         BW:=(PRGB^.R+PRGB^.G+PRGB^.B) div 3;
        BW2:=(PRGB2^.R+PRGB2^.G+PRGB2^.B) div 3;
      If   ( Abs( bw - bw2 )> C ) then
      begin
          result:=True;
          MaxX:=Max(X,MaxX); MaxY:=Max(MaxY,Y);
          minX:=min(minX,X); minY:=min(minY,Y);
          R:= rect(minX, minY, maxX,maxY);
       end;
        Inc(PByte(PixelPtr), BytePerPixel);
        Inc(PByte(PixelPtr2), BytePerPixel);
      end;
      Inc(PByte(PixelRowPtr),Bitmap.RawImage.Description.BytesPerLine);
      Inc(PByte(PixelRowPtr2),Bitmap.RawImage.Description.BytesPerLine);
    end;
  finally
  Bitmap.EndUpdate(False);
  end;
end;

Однако фокус в том, что скорости при "прямом доступе" более чем достаточно что бы использовать даже это "рукоделье" без уменьшения разрешения .
Зы
О да! Тут точно не одна "строчка кода". + есть встроенное "обесцвечивание". :idea: но и задача совсем другая чем "просто пройти по коридору" :D то бишь сравнить два изображения на тождество ..
Хотя разнообразная оптимизация просто напрашивается например можно проверять не каждую точку а сетку точек причем со смещением от кадра к кадру.(что будет даже быстрее чем при использовании предварительного масштабирования + исчезнет проблема "мыла" в изображении )
Зы Зы
Испытать детектор движения лично можно тут :arrow: Truba_DS_0_0059_14_2_5_Bin.7z :idea: "Запуск трансляции ." ->"Окно цифровые эффекты" -> фильтр 'Выделить движение' Чувствительность "меньше лучше "... экспериментально лучшие значение около 50... требуется веб камера или её эмулятор...
Alex2013
энтузиаст
 
Сообщения: 1377
Зарегистрирован: 03.04.2013 11:59:44

Пред.

Вернуться в Общее

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

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

Рейтинг@Mail.ru