Страница 4 из 5
Re: Оптимизация сравнения двух изображений
Добавлено: 24.04.2019 14:35:29
olegy123
инструкции MMX/SSE/AVX заточены на скоростные выполнение с векторами(массивами чисел)
sts писал(а):могу посоветовать для StretchDraw (если винда) использовать GDI+ под старую винду или Direct2D, они, при возможности используют аппаратное ускорение.
тут есть свои минусы - как правило копирование в аппарат, выставление программы, режима, работа тоже занимает время и выгрузка результата.
Re: Оптимизация сравнения двух изображений
Добавлено: 24.04.2019 15:03:55
Alex2013
sts писал(а):забавно что алгоритм автора наименее ресурсоемкий ну и подслеповатый, любой другой будет на порядок дороже но и более правильный. могу посоветовать для StretchDraw (если винда) использовать GDI+ под старую винду или Direct2D, они, при возможности используют аппаратное ускорение.
Извини не понял
"алгоритм автора" это про алгоритм ТС или мой?
StretchDraw применяю регулярно но в данном случае это неприменимо по причине дополнительного и по идее очень не быстрого действия ( тут
olegy123 совершено прав ! )... (Фокус CompareByte в том что он
останавливается при первом же не соответствии (причем сравнение идет сразу сначала и конца массива ) что в случае маловероятного случайного спадения происходит мгновенно, то есть на ожидание образца времени не тратится совсем )
Добавлено спустя 10 минут 26 секунд:Лекс Айрин писал(а):...
По утилите для WMR тоже оффтоп хотя и менее злостный так что если интересно о ней спорить дальше, читай мой ответ уже
ТУТ
Re: Оптимизация сравнения двух изображений
Добавлено: 24.04.2019 17:09:13
sts
я про ТС
Re: Оптимизация сравнения двух изображений
Добавлено: 25.04.2019 04:10:02
Alex2013
sts писал(а):я про ТС
У ТС заведомо нереальный тормоз Сanvas.Piхеls[...] страшнее атомной войны..
(Уж поверь тому кто целую "Лаборатории распознавания образов" через Сanvas.Piхеls в 2015 году пытался писать ...)

Nv_BETA003.zipДля сравнения "другой технологический уровень " через пару лет...
https://youtu.be/ti13V4hxPIQ ( Тут я еще не научился видео с экрана писать поэтому чистота кадров этого ролика низковата зато на "трубе" )
https://drive.google.com/uc?export=open&confirm=no_antivirus&id=1GjxRufy1HJjSnykQqLI5vpp5O0o9HN9ohttps://drive.google.com/uc?export=open ... tJi-8xb0cQ (Тут гифка чуть побольше )
Суть показа достигнутой возможности работы с живым видео в "реальном времени" (или рядом )
Скорость на 2-3
порядка выше чем можно получить через Сanvas.Piхеls...
Re: Оптимизация сравнения двух изображений
Добавлено: 25.04.2019 08:52:40
sts
и? как это противоречит тому что я написал?
Re: Оптимизация сравнения двух изображений
Добавлено: 25.04.2019 16:13:18
Alex2013
sts писал(а):и? как это противоречит тому что я написал?
sts писал(а):наименее ресурсоемкий ну и подслеповатый, любой другой будет на порядок дороже
Это где он "наименее ресурсоемкий" ? (Возможно я опять что-то не понял ... но мой вариант (без проверок) одна строчка кода + быстрый доступ и не совсем тупое сравнение ( насколько я понял CompareBayte останавливает сравнение при первом же несоответствии )
Re: Оптимизация сравнения двух изображений
Добавлено: 25.04.2019 16:20:12
Лекс Айрин
Alex2013, а что за этой строчкой? Там же может быть целая телега текста, подцепленная куча левых модулей и макаронные переходы.
Re: Оптимизация сравнения двух изображений
Добавлено: 25.04.2019 16:34:07
Alex2013
Лекс Айрин писал(а):Alex2013, а что за этой строчкой? Там же может быть целая телега текста, подцепленная куча левых модулей и макаронные переходы.
Вот не верующий Фома! Копнуть самостоятельно "нет судьбы" ?

Не хочешь быть помощником "расхитительницы гробниц"? - ну так и быть я за него!
Код: Выделить всё
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;
Re: Оптимизация сравнения двух изображений
Добавлено: 25.04.2019 16:57:02
sts
Alex2013 писал(а):Это где он "наименее ресурсоемкий" ? (Возможно я оять что-то не понял ... но мой вариант (без проверок) одна строчка кода + быстрый доступ и не совсем тупое сравнение ( насколько я понял CompareBayte останавливает сравнение при первом же несоответствии )
вариант с CompareByte вообще не имеет отношения к решаемой задаче, остановка при любом не соответствии не нужна, нужно чтоб игнорировался шум матрицы, естественный перепад освещенности, разовые помехи (если камера с аналоговым трактом, или как там это называется), StretchDraw как раз решает эти задачи хоть и не так хорошо как хотелось бы, а полноценные алгоритмы, по ресурсоемкости, эквивалентны десяткам тысяч вызовов StretchDraw на кадр, теже нейросети.
Re: Оптимизация сравнения двух изображений
Добавлено: 25.04.2019 18:02:26
Лекс Айрин
Alex2013, конечно. Любой программист, который захочет писать более-менее нормальный код будет неверующим Фомой. Просто ты никогда не говори, что решаешь что-то одной строчкой, если ты используешь вызов подпрограммы. А посмотреть я действительно не могу. Я тогда был на улице, так что просто не мог глянуть при всем желании. Физически.
Re: Оптимизация сравнения двух изображений
Добавлено: 25.04.2019 19:25:24
Alex2013
sts писал(а):вариант с CompareByte вообще не имеет отношения к решаемой задаче, остановка при любом не соответствии не нужна
В шапке темы стоит " Оптимизация сравнения двух изображений" и я поднял ее как раз как источник методов
сравнения двух изображений возможно у ТС стаяла несколько иная задача но мой CompareBMP подходит к заголовку темы на 100%. Что до сравнения
образов изображения то есть довольно быстрый "морфологический анализ" ( кстати его используют как одни из методов для анализа изображений в WMR )



Первая картинка как раз "морфология" и это совсем не нейросеть ...
Кстати вот моя моя попытка реализации...
Morphological001.7z

( ...наверное в первый раз так удачно параметры настроил - и совершенно не тормозит )
Что до более сложных методик до того как "начинать грызть баобабы" эмуляции нейросетей стоит что-то попроще попробовать например "Каскады Хаара"
FaceDetect002.7z
(Теперь даже робот не пройдет мимо девушки с обложки ....

)
Re: Оптимизация сравнения двух изображений
Добавлено: 26.04.2019 08:16:35
sts
Вы реагируете на форму а надо на содержание, не делайте так это неправильно.
В исходной задаче четко сказано о сравнение изображений с камеры для обнаружения движения.
Re: Оптимизация сравнения двух изображений
Добавлено: 26.04.2019 16:27:00
Alex2013
Для обнаружения движения есть множество быстрых и простых способов.
На пример вот одно из моих "коронных"

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

(Видимый "тормоз" просто низкая частота кадров при записи гифа в реальности все работает быстрее и по ощущениям вообще без задержки )
Код: Выделить всё
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;
Однако фокус в том, что скорости при "прямом доступе" более чем достаточно что бы использовать даже это "рукоделье" без уменьшения разрешения .
Зы
О да! Тут точно не одна "строчка кода". + есть встроенное "обесцвечивание".

но и задача совсем другая чем "просто пройти по коридору"

то бишь сравнить два изображения на тождество ..
Хотя разнообразная оптимизация просто напрашивается например можно проверять
не каждую точку а
сетку точек причем со смещением от кадра к кадру.(что будет даже быстрее чем при использовании предварительного масштабирования + исчезнет проблема "мыла" в изображении )
Зы Зы
Испытать детектор движения лично можно тут
Truba_DS_0_0059_14_2_5_Bin.7z 
"Запуск трансляции ." ->"Окно цифровые эффекты" -> фильтр 'Выделить движение' Чувствительность "меньше лучше "... экспериментально лучшие значение около 50... требуется веб камера или её эмулятор...
Re: Оптимизация сравнения двух изображений
Добавлено: 10.07.2019 01:53:32
yus
Мне понравился вот такой алгоритм сравнения изображений.
https://habr.com/ru/post/120562/
Re: Оптимизация сравнения двух изображений
Добавлено: 10.07.2019 12:45:02
olegy123
там много недостатков, хеши нужны для "отпечатков" данных, быстры при поиске но если бит будет изменен то весь хеш станет иным.