Для обнаружения движения есть множество быстрых и простых способов.
На пример вот одно из моих "коронных"
решений "в лоб".... сделано очень примитивно и неоптимально.
Но в простейшем случае работает . (Хотя в данном случае нет поиска нескольких движущихся объектов но абстрактное движение "вообще" вполне ловит и выделяет в рамку )
(Видимый "тормоз" просто низкая частота кадров при записи гифа в реальности все работает быстрее и по ощущениям вообще без задержки )
- Код: Выделить всё
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... требуется веб камера или её эмулятор...