[РЕШЕНО] Windows 10 и захват кадра из видеопотока с камеры

Вопросы программирования и использования среды Lazarus.

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

Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с кам

Сообщение Alex2013 » 21.07.2017 10:39:13

olegy123 писал(а):Почему Wine?

Ууу... вы действительно хотите это знать ? 8) "Зловеще усмехаюсь" ... :D Блин ... да просто потому, что в интернет хожу через линукс ...
...и иногда перезагружаться лень ... :oops:
Вот так гораздо познавательней будет ! :idea:
ИзображениеИзображение

Alex2013 писал(а):+ Может кому пригодится эти две процедуры
Первая FastBW "Быстрое обесцвечивание"
и вторая FastBWComp "Оригинальное сравнение " двух кадров для датчика движения .
( лучше пока не придумал )

Тогда уж лучше DX - есть фильтры. Сложнее под Linux - но там есть OpenCV.
Вообще я делал так:
Linux, Lazarus, OpenGL,OpenCV, FFMpeg
Картинку обесцвечивать можно шейдерах.

А чем в OpenCV лучше ? Смотрел в код все тоже самое только на сях...

С OpenGL классно но "из пушки по воробьям"...
Кстати ! Вот еще одна жертва "инженерного анализа" и доморощенной оптимизации ...
"Горизонтальное зеркало "
"Флипнуть до космопорта" не желаете ? :idea: :wink:
Код: Выделить всё
procedure FlipVert(var Src: TBitmap);
Type
A=Array [0..1] of byte;
var
   dest:TBitmap;
   X3,X2,w,h,x,y:integer;
   pd,ps:^A;
begin
  w:=Src.width;
  h:=Src.height;
  dest:=TBitmap.Create;dest.SetSize(w,h);
//  dest.pixelformat:=pf24bit;
//  Src.pixelformat:=pf24bit;
  for y:=0 to h-1 do begin
  dest.BeginUpdate(False);
   pd:=dest.scanline[y];
   ps:=Src.scanline[y];
      X2:=0;  X3:=(w-1)*3;
      for x:=0 to w-1 do begin
        move (ps^[X3],pd^[x2],3);
        Inc(X2,3);  dec(X3,3);
       end;
   dest.EndUpdate(False);
   end;
  Src.assign(dest);
  dest.free;
end;
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с кам

Сообщение Pavia » 21.07.2017 11:53:40

Это разве оптимизация? Вот это оптимизация!
Код: Выделить всё
procedure Speculitiv_Base(bm:TByteMap;  mode:TModeXY);
{12-20 тик на пиксель 3 канала modex}
{20-30 тик на пиксель 3 канала modexy}
{9-15 тик на пиксель 3 канала modey}
var c1,c2,c3:Byte;
i,j:Integer;
p1,p2:PAByte;
begin
  if (mode=modex) or (mode=modexy)  then
   begin
   if bm.UnitFormat=uf3Unit then
    begin
    for j:=0 to bm.Height-1 do
     begin
     p1:=bm.ScanLine[j];
      for i:=0 to bm.Width shr 1 do
       begin
       c1:=p1[i*3+0];
       c2:=p1[i*3+1];
       c3:=p1[i*3+2];
       p1[i*3+0]:=p1[(bm.Width-1-i)*3+0];
       p1[i*3+1]:=p1[(bm.Width-1-i)*3+1];
       p1[i*3+2]:=p1[(bm.Width-1-i)*3+2];
       p1[(bm.Width-1-i)*3+0]:=c1;
       p1[(bm.Width-1-i)*3+1]:=c2;
       p1[(bm.Width-1-i)*3+2]:=c3;
       end;
     end;
    end;
   end;

  if (mode=modey) or (mode=modexy)  then
   begin
   if bm.UnitFormat=uf3Unit then
    begin
    for j:=0 to bm.Height shr 1 do
     begin
     p1:=bm.ScanLine[j];
     p2:=bm.ScanLine[bm.Height-j-1];
      for i:=0 to bm.Width-1 do
       begin
       c1:=p1[i*3+0];
       c2:=p1[i*3+1];
       c3:=p1[i*3+2];
       p1[i*3+0]:=p2[i*3+0];
       p1[i*3+1]:=p2[i*3+1];
       p1[i*3+2]:=p2[i*3+2];
       p2[i*3+0]:=c1;
       p2[i*3+1]:=c2;
       p2[i*3+2]:=c3;
       end;
     end;
    end;
   end;

end;

Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с кам

Сообщение Alex2013 » 21.07.2017 12:33:14

Pavia писал(а):Это разве оптимизация? Вот это оптимизация!
...

Ну я честно написал " доморощенная оптимизация" ... в исходнике было хуже ...

Хотя и по твоему варианту можно пару очевидных замечаний сделать :

1 Умножение съедает на удивление много быстродействия (Проверено !) Зачем оно если можно обойтись без него ?
2 Почему нет move ? Мало того что расчет индекса и присвоение значения идет для каждого байта так еще и по смещению сдвиг считает ...

Хотя без второго битмапа действительно было бы еще лучше и второй цикл (через фор) можно смело выкинуть ....
+ оптимизация "по тикам" тоже разумеется вещь полезная (Если работает! ...пока, признаюсь, сходу не понял суть метода... )
Последний раз редактировалось Alex2013 21.07.2017 13:14:09, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с кам

Сообщение Pavia » 21.07.2017 13:09:32

1) Знаю что много. В данном случае оптимизатор ухитряется умножение заменяет вычислением адреса [EAX*2+EAX] - что быстро.
2) Основная ветка на D7, а там move медленный. Если делать по 4 байта не факт что быстрее будет, но думою скорость увеличиться до 4-6 тактов.
3)
Alex2013 писал(а):пока, признаюсь, сходу не понял суть метода... )
тот же Flip только с выбором горизонталь, вертикаль или оба вместе.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с кам

Сообщение Alex2013 » 21.07.2017 13:15:46

Ну у меня не дельфи ... так что как-то так ... :roll: Если не напутал где-то .

Код: Выделить всё
procedure FlipVert(var Src: TBitmap);
Type
A=Array [0..1] of byte;
var
С:Record  R,G,B  : byte; end;;
   X3,X2,w,w2,h,x,y:integer;
   ps:^A;

begin
  w:=Src.width;
  h:=Src.height;
  w2:=(w-1)*3 ;// Мой косяк  нужно w2:=(w-1)*3 dv 2; !
   for y:=0 to h-1 do begin
   Scr.BeginUpdate(False);
   ps:=Src.scanline[y];
      X2:=0;  X3:=W2;
    While X2 < w2  do begin
      move (ps^[X2],C,3);
      move (ps^[X3],ps^[x2],3);
      move (C,ps^[X3],3);
      Inc(X2,3);  dec(X3,3);
     end;
   Scr.EndUpdate(False);
   end;
end;

Если без move по моему, все рано лучше умножать индексы заранее ...
...
c1:=p1[X2]; c2:=p1[X2+1]; c3:=p1[X2+2];
...
Inc(X2,3); dec(X3,3);
...

тот же Flip только с выбором горизонталь, вертикаль или оба вместе.

Уже разобрался . Спасибо за полезные идеи !

Добавлено спустя 12 часов 21 минуту 51 секунду:
Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с камеры
Кстати народ у кого вин 10 могут понаблюдать прикол ...
Защитник вин 10 ругается на АРХИВ текущей 5- й сборки..
Если кто-то не понял не на содержимое а именно на архив :idea:
"Видал я котов без улыбки но улыбки без кота не видывал..." :D :D :mrgreen:

Добавлено спустя 19 часов 13 секунд:
Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с камеры
2Pavia : Все мне казалось что где-то что-то в твоем варианте можно крупно ускорить ... раза в два ! :idea:
Но только сейчас вник ...
Код: Выделить всё
procedure NewFlipVert(var Src: TBitmap);
Type

RG=Record  R,G,B  : byte; end;
A=Array [0..1] of RG;
var
   C:RG;   PC:^RG;//Так нагляднее !
   w,h,x,y:integer;
   ps:^A;
begin
  w:=Src.Width div 2; // Вот где собака !
  h:=Src.height;
  for y:=0 to h-1 do begin
   Src.BeginUpdate(False);
   ps:=Src.scanline[y];
// Прокручиваю обмен от середины к краям
// и понятное дело цикл идет только до половины ширины
   for x:=0 to w-1 do begin
     C:= PS^[w-x];
     PS^[w-x]:=PS^[X+W];
     Ps^[x+W]:=C;
     end;
   Src.EndUpdate(False);
   end;
end;

Честно говоря я теперь не совсем понимаю как твой вариант может работать ... :roll:
( у меня он, кстати то работал то нет ... Ага алгоритм Pavia- Шреденгера ! ) :D
Последний раз редактировалось Alex2013 24.07.2017 15:56:04, всего редактировалось 2 раз(а).
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с кам

Сообщение Pavia » 23.07.2017 17:37:08

Alex2013
Alex2013 писал(а):( у меня он, кстати то работал то нет ... Ага алгоритм Pavia- Шреденгера ! )

ScanLine глючит. Используй TBitmap.RawImage.Data.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с кам

Сообщение Alex2013 » 24.07.2017 15:35:56

Pavia писал(а):Alex2013
Alex2013 писал(а):( у меня он, кстати то работал то нет ... Ага алгоритм Pavia- Шреденгера ! )

ScanLine глючит. Используй TBitmap.RawImage.Data.


Мне тоже так показалось... и с RawImage в Лазарусе как-бы быстрее .... :roll:
Но там была как мне кажется чисто "логическая яма " . У тебя обмен идет от краев к центру ...
А после пресечения центра, что происходит ? :idea: Обратно что-ли меняет ? :idea: :shock:
....
... стоп! О горе мне невнимательному! Извини, не заметил bm.Width shr 1 ! :oops:

Теперь все понятно ! :D

Добавлено ...

Труба завет ! :D
Очередная гм..."ночная сборка" (В смысле по случаю "внезапной" жары проснулся ночью часа в 3 ночи и давай програмить... ) :idea: :D
:idea: :arrow: Truba_DS_0_0055.7z
Добавил рамку "видоискателя" в окошке предпросмотра ...
ИзображениеИзображение

Добавил возможность увеличения в "галерею слежения" ...
ИзображениеИзображение

Кликаешь в миниатюру получаешь ее же зум копию ( повторный клик в картинку убирает зум )

ИзображениеИзображение
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: [РЕШЕНО] Windows 10 и захват кадра из видеопотока с кам

Сообщение Alex2013 » 27.07.2017 20:53:30

И так дабы не мусорить основной поток форума сделал отдельную тему для "продолжения банкета" ! :idea:

:arrow: Исследовательский проект "Цифровая оптика" .

Изображение
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru