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

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

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

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

Сообщение Alex2013 » 25.04.2017 22:31:10

Столкнулся с проблемой !
Старые способы захвата кадра из видео потока ...
:arrow: viewtopic.php?p=86483#p86483
:arrow: viewtopic.php?p=86918#p86918
Код: Выделить всё
// Захват кадра
function capCreateCaptureWindow
(lpszWindowName : PChar; dwStyle : Integer; x : Integer; y : Integer;
nWidth : Integer; nHeight : Integer; hWndParent : Integer; nID : Integer)
: Integer; stdcall; external 'avicap32.dll' name 'capCreateCaptureWindowA';

procedure TMainForm.Button2Click(Sender: TObject);
const
  WM_USER = $00000400;

  WM_CAP_START                    = WM_USER; //старт для сообщений
  WM_CAP_GET_CAPSTREAMPTR         = WM_CAP_START + 1;
  //описание callback ошибок
  WM_CAP_SET_CALLBACK_ERROR       = WM_CAP_START + 2;
  WM_CAP_SET_CALLBACK_STATUS      = WM_CAP_START + 3;

  WM_CAP_SET_CALLBACK_YIELD       = WM_CAP_START + 4;
  WM_CAP_SET_CALLBACK_FRAME       = WM_CAP_START + 5;
  WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
  WM_CAP_SET_CALLBACK_WAVESTREAM  = WM_CAP_START + 7;
  WM_CAP_GET_USER_DATA            = WM_CAP_START + 8;
  WM_CAP_SET_USER_DATA            = WM_CAP_START + 9;

  WM_CAP_DRIVER_CONNECT           = WM_CAP_START + 10;
  WM_CAP_DRIVER_DISCONNECT        = WM_CAP_START + 11;

  WM_CAP_DRIVER_GET_NAME          = WM_CAP_START + 12;
  WM_CAP_DRIVER_GET_VERSION       = WM_CAP_START + 13;

  WM_CAP_DRIVER_GET_CAPS          = WM_CAP_START + 14;

  WM_CAP_FILE_SET_CAPTURE_FILE    = WM_CAP_START + 20;
  WM_CAP_FILE_GET_CAPTURE_FILE    = WM_CAP_START + 21;
  WM_CAP_FILE_SAVEAS              = WM_CAP_START + 23;
  WM_CAP_FILE_SAVEDIB             = WM_CAP_START + 25;

  WM_CAP_FILE_ALLOCATE            = WM_CAP_START + 22;
  WM_CAP_FILE_SET_INFOCHUNK       = WM_CAP_START + 24;

  WM_CAP_EDIT_COPY                = WM_CAP_START + 30;

  WM_CAP_SET_AUDIOFORMAT          = WM_CAP_START + 35;
  WM_CAP_GET_AUDIOFORMAT          = WM_CAP_START + 36;

  WM_CAP_DLG_VIDEOFORMAT          = WM_CAP_START + 41;
  WM_CAP_DLG_VIDEOSOURCE          = WM_CAP_START + 42;
  WM_CAP_DLG_VIDEODISPLAY         = WM_CAP_START + 43;
  WM_CAP_GET_VIDEOFORMAT          = WM_CAP_START + 44;
  WM_CAP_SET_VIDEOFORMAT          = WM_CAP_START + 45;
  WM_CAP_DLG_VIDEOCOMPRESSION     = WM_CAP_START + 46;

  WM_CAP_SET_PREVIEW              = WM_CAP_START + 50;
  WM_CAP_SET_OVERLAY              = WM_CAP_START + 51;
  WM_CAP_SET_PREVIEWRATE          = WM_CAP_START + 52;
  WM_CAP_SET_SCALE                = WM_CAP_START + 53;
  WM_CAP_GET_STATUS               = WM_CAP_START + 54;
  WM_CAP_SET_SCROLL               = WM_CAP_START + 55;

  WM_CAP_GRAB_FRAME               = WM_CAP_START + 60;
  WM_CAP_GRAB_FRAME_NOSTOP        = WM_CAP_START + 61;

  WM_CAP_SEQUENCE                 = WM_CAP_START + 62;
  WM_CAP_SEQUENCE_NOFILE          = WM_CAP_START + 63;
  WM_CAP_SET_SEQUENCE_SETUP       = WM_CAP_START + 64;
  WM_CAP_GET_SEQUENCE_SETUP       = WM_CAP_START + 65;

  WM_CAP_SET_MCI_DEVICE           = WM_CAP_START + 66;
  WM_CAP_GET_MCI_DEVICE           = WM_CAP_START + 67;

  WM_CAP_STOP                     = WM_CAP_START + 68;
  WM_CAP_ABORT                    = WM_CAP_START + 69;

  WM_CAP_SINGLE_FRAME_OPEN        = WM_CAP_START + 70;
  WM_CAP_SINGLE_FRAME_CLOSE       = WM_CAP_START + 71;
  WM_CAP_SINGLE_FRAME             = WM_CAP_START + 72;

  WM_CAP_PAL_OPEN                 = WM_CAP_START + 80;
  WM_CAP_PAL_SAVE                 = WM_CAP_START + 81;

  WM_CAP_PAL_PASTE                = WM_CAP_START + 82;
  WM_CAP_PAL_AUTOCREATE           = WM_CAP_START + 83;
  WM_CAP_PAL_MANUALCREATE         = WM_CAP_START + 84;
  // Following added post VFW 1.1
  WM_CAP_SET_CALLBACK_CAPCONTROL  = WM_CAP_START + 85;

  CONTROLCALLBACK_PREROLL         = 1 ; //* Waiting to start capture */
  CONTROLCALLBACK_CAPTURING       = 2 ; //* Now capturing */

hCamCapture : Integer=0;
Var
  hHandle:HWND;
  fRefreshRate: integer;
  fViewStyle: integer;
  r: TRect;
  ID: TGUID;
  S: string;

function CapControlCallback (Hwnd, nState:dword): dword; stdcall;
  //var   pCls: THIWebCam;
begin
//   pCls := THIWebCam(GetProp(hwnd, PChar('OwnerObject')));
   Result := nState;

end;

begin
hHandle := self.Panel2.Handle;
// Connect;

   R:= self.Panel2.ReadBounds;
   S := 'WebCam_' + intTostr(LongInt(Self));
   if hCamCapture = 0 then begin

    hCamCapture := capCreateCaptureWindow(PChar(S),
    WS_VISIBLE OR WS_CHILD OR WS_CLIPSIBLINGS,
    0, 0, r.right-r.left, r.bottom-r.top, hHandle, LongInt(self));


   SetProp(hCamCapture,PChar('OwnerObject'), integer(pointer(self)));
   SendMessage(hCamCapture, WM_CAP_DRIVER_CONNECT, 0, 0);
   SendMessage(hCamCapture, WM_CAP_SET_OVERLAY, 0, 0);
   SendMessage(hCamCapture, WM_CAP_SET_PREVIEW, 1, 0);
   SendMessage(hCamCapture, WM_CAP_SET_SCALE, fViewStyle, 0);
   SendMessage(hCamCapture, WM_CAP_SET_PREVIEWRATE, fRefreshRate, 25);
// SendMessage(hCamCapture, WM_CAP_SET_CALLBACK_CAPCONTROL, 0, longint(@CapControlCallback));
end;
SendMessage(hCamCapture, WM_CAP_EDIT_COPY, 0, 0);
Imag1.Picture.Bitmap.LoadFromClipboardFormat(2);
// .LoadFromClipboardFormat (ctClipboard);
SendMessage(hCamCapture, WM_CAP_DRIVER_DISCONNECT, 0, 0);
DestroyWindow(hCamCapture);
hCamCapture := 0;

end;


...не работают с планшетом-трансформером (Nomi W10100 Deka )в Вин 10 можно было-бы косить на 64 разряда но ... на другом ноте все прекрасно работает на Вин 7 и Вин 8 64 бита.... ("Режим совместимости" проверял не помогает... )
Возможно глюки конкретного железа (в планшете как нынче водится аж две камеры... одинаковой паршивости ... ) но в штатном приложении "камера" и скайпе все нормально

1 Никто сталкивался с подобной проблемой ?
2 Может кто-то более "прямой" способ захвата посоветовать ? (Мой явно не самый оптимальный)
Последний раз редактировалось Alex2013 12.05.2017 14:08:32, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение serbod » 26.04.2017 10:54:02

Если окно видео работает, то формат картинки не совместим с форматом буфера обмена.
Если окно видео не работает, то проблема в инициализации драйвера захвата.
Аватара пользователя
serbod
постоялец
 
Сообщения: 145
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение olegy123 » 28.04.2017 10:37:13

http://www.sql.ru/forum/815165/rabota-s ... b-kamerami

Добавлено спустя 5 минут 6 секунд:
Alex2013 писал(а):2 Может кто-то более "прямой" способ захвата посоветовать ? (Мой явно не самый оптимальный)

В винде желательно работать через DirectX.

Хотя можно подключить OpenCV - если надо картинки получить и анализировать..
если надо видео - то ffmpeg обладет всем функционалом, правда нужно хендлы парсить либо вайперы писать.
olegy123
энтузиаст
 
Сообщения: 580
Зарегистрирован: 25.02.2016 12:10:20

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение Alex2013 » 29.04.2017 00:48:31

olegy123 писал(а):http://www.sql.ru/forum/815165/rabota-s-dvumya-web-kamerami

Добавлено спустя 5 минут 6 секунд:
Alex2013 писал(а):2 Может кто-то более "прямой" способ захвата посоветовать ? (Мой явно не самый оптимальный)

В винде желательно работать через DirectX.

Хотя можно подключить OpenCV - если надо картинки получить и анализировать..
если надо видео - то ffmpeg обладет всем функционалом, правда нужно хендлы парсить либо вайперы писать.


Спасибо, попробую!
OpenCV - когда-то пробовал показалось тяжеловато и "монструозно" ... Сейчас задача еще проще чем была: сделать простой зум + датчик движения...
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение olegy123 » 29.04.2017 01:41:36

Alex2013 писал(а): Сейчас задача еще проще чем была: сделать простой зум + датчик движения...

OpenCV - однозначно..
там все просто, нужно изучить инструментарий.. Он не сложен, вся работа строится над изображением, блокам, выявлении границ, перевод в геометрические фигуры..

Схема такая: все кадры нужно переводить в серый (gray ) вид.
Первый кадр сохраняешь..
следующий кадр сравниваешь по разности пикселов с сохраненным предыдущим.. - эта разница(отличная от нуля) есть изменения пикселов.. далее анализируешь.. допустим по размеру блока- регион.
Блок смещается - есть движение..
olegy123
энтузиаст
 
Сообщения: 580
Зарегистрирован: 25.02.2016 12:10:20

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение Alex2013 » 01.05.2017 11:51:42

olegy123 писал(а):OpenCV - однозначно..

:shock: Ну и зачем ? У меня и так все работает ... :roll:
«Доморощенный расширитель реальности »SV_MOD2
Программе есть уже сейчас есть функция "слежение" которая довольно уверенно распознает движение

Проблема именно с ЗАХВАТОМ на планшете .
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение Alex2013 » 07.05.2017 11:12:41

Вот эти примеры работают ...
:arrow: http://basicsprog.ucoz.ru/publ/6-1-0-27
Но они под Дельфи .....
Вопрос: как можно того-же в Лазарусе дробится ? (Попытки конверсии успехом не увенчались )
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение zub » 09.05.2017 02:37:10

>>Вопрос: как можно того-же в Лазарусе дробится ? (Попытки конверсии успехом не увенчались )
Ответ: В лазарусе этого можно добиться абсолютно также. Всё легко конвертируется и работает.
>>Попытки конверсии успехом не увенчались
А ты точно пробовал? Когда пробуют обычно сталкиваются с отсутствием хидеров, отсутствием функций в хидерах, несовместимостью типов... При этом задают конкретные вопросы и приводят конкретные сообщения об ошибках, а не тупо ниче ничем неувенчалось...
zub
долгожитель
 
Сообщения: 2134
Зарегистрирован: 14.11.2005 23:51:26

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение olegy123 » 09.05.2017 23:27:03

DirectX9 для fpc можно найти тут http://www.clootie.ru/fpc/index.html
Учтите что вполне возможно в DX9<>DX10<>DX11<>DX12 - что то изменится.. добавят новые параметры, уберут старые..
Но вообще то советую использовать OpenCV - эта библиотека которая умеет работать с видеоисточниками.
olegy123
энтузиаст
 
Сообщения: 580
Зарегистрирован: 25.02.2016 12:10:20

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение Alex2013 » 10.05.2017 13:15:51

Точно пробовал ... там ошибка именно в компиляции библиотеки DirectShow.zip
Возможно названия "системных"-типов не совпадают.
Вообщем подумал что если есть аналог для Lazarus -а то зачем огород городить ...

Добавлено спустя 15 минут:
olegy123 писал(а):DirectX9 для fpc можно найти тут http://www.clootie.ru/fpc/index.html
Учтите что вполне возможно в DX9<>DX10<>DX11<>DX12 - что то изменится.. добавят новые параметры, уберут старые..
Но вообще то советую использовать OpenCV - эта библиотека которая умеет работать с видеоисточниками.

Спасибо посмотрю ...
OpenCV -вещь универсальная но повторяю для простой задачки из разряда "между делом" показался избыточно "монструозным"
(В чем смысл использовать (и таскать с программой ) библиотеку для того... что бы использовать другую библиотеку (только встроенную )
и к тому-же весь нужный код размером в выше приведенную процедур... :?: )
:roll:
Пока тем более что вся "песня о плясках" просто любительский проект...
..что-то вроде подзорной трубы и возможно запись кадра при обнаружении движения (а дальше буду думать что еще можно добавить .. )
(если планшет-трансформер с камерой то такая штука точно не помешает )
Если бы работал старый код я бы вообще не заморачивался там все что нужно есть .
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение zub » 10.05.2017 19:48:43

>>Точно пробовал ... там ошибка именно в компиляции библиотеки
Нифига ты не пробовал... только лясы точить, где конкретные ошибки?

Первая ссылка в гугле на lazarus-ccr
https://www.google.ru/search?client=ope ... tAHM2rzgCw
качаешь по ней directshow9.pas и несколько его зависимостей, всё прекрасно компилится.
потом дорабатываешь Unit1 этого "чудопроекта" примерно следующим способом:
Код: Выделить всё
--- E:/kamera1old/kamera1/Unit1.pas
+++ E:/kamera1/kamera1/Unit1.pas
@@ -46 +46 @@ var
-  DeviceName:OleVariant;  //РёРјСЏ устройства
+  DeviceName:{Ole}Variant;  //РёРјСЏ устройства
@@ -68,0 +69,6 @@ var
+    function OleCreatePropertyFrame(hwndOwner: HWnd; x, y: Integer;
+      lpszCaption: POleStr; cObjects: Integer; pObjects: Pointer;
+      cPages: Integer; pPageCLSIDs: Pointer; lcid: TLCID; dwReserved: Longint;
+      pvReserved: Pointer): HResult; stdcall;
+
+
@@ -72,0 +79,2 @@ implementation
+function OleCreatePropertyFrame;        external 'olepro32' name 'OleCreatePropertyFrame';
+
@@ -86 +94 @@ setlength(MArray1,0);
-while (S_OK=pEnum.Next(1,pMoniker,Nil)) do
+while (S_OK=pEnum.Next(1,pMoniker,ULong(Nil^))) do
@@ -104 +112 @@ setlength(MArray2,0);
-while (S_OK=pEnum.Next(1,pMoniker,Nil)) do
+while (S_OK=pEnum.Next(1,pMoniker,ULong(Nil^))) do
@@ -287 +295 @@ var
-  Pages: CAUUID;
+  Pages: tagCAUUID;
@@ -342 +350 @@ var
-  Pages: CAUUID;
+  Pages: tagCAUUID;

Всё работает. т.е. добавить объявление OleCreatePropertyFrame глядя в msdn, сменить передачу параметра через укзатель на через out в 2х местах, и поменять название типа в 2х местах...
Делов на 5 минут, а топик висит уже...
zub
долгожитель
 
Сообщения: 2134
Зарегистрирован: 14.11.2005 23:51:26

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение Alex2013 » 11.05.2017 16:18:27

Гм ... "Позволю себе несогласия с предыдущим оратором !" Десу но мне отсюда как-бы виднее ... :D
Моя сборка + библиотека DirectX+DirectXShow DxShowCam_01.7z
Уф собрал действительно "недолго умчалась старушка в высоковольтных проводах "( хотя со скрипом и фейспалмом когда ДОШЛО ... ага "Get Out " (TM) )... но в Win7(32) работает "на ура !" а в Win 10 (64) "фильтры не фильтруют" ... :roll: (выдает сообщение "Произошла ошибка при построении графа фильтров " при запуске и смене камеры ...и ничего не показывает )
В прочем может пример Кам1 неудачный надо другие попробовать...
Ps
Топик "висит" потому что проект ну совершенно не срочный ... а для форума думаю будет полезно ...

Ps Ps
ULong(Nil^) мюсье знает толк ... :wink: впрочем сам что-то похожее пытался писать пока не ДОШЛО ... :shock: :arrow: :mrgreen:
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение zub » 11.05.2017 18:32:01

Пожалуйста, перед постами собирайся с мыслями. А то такой разлет, смысловые обороты, смайлы... - ниочем.
Повторяю 3ий раз конкретику давай - на какой строчке? где? какая ошибка?

>>ULong(Nil^) мюсье знает толк ... :wink: впрочем сам что-то похожее пытался писать пока не ДОШЛО ... :shock: :arrow: :mrgreen:
точно, пока до тебя ничего не дошло))
Конкретизируй что имеешь против в данном случае

Добавлено спустя 1 минуту 30 секунд:
Извращения - это когда кадр копипастишь через буфер обмена
zub
долгожитель
 
Сообщения: 2134
Зарегистрирован: 14.11.2005 23:51:26

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение Alex2013 » 11.05.2017 19:06:17

zub писал(а):>>ULong(Nil^) мюсье знает толк ... впрочем сам что-то похожее пытался писать пока не ДОШЛО ...
точно, пока до тебя ничего не дошло))
Конкретизируй что имеешь против в данном случае

Посмотри как у меня сделано ...
Код: Выделить всё
function TForm1.Initializ: HResult;
var
    ff1: ULong;
begin
...
while (S_OK=pEnum.Next(1,pMoniker,ff1)) do

Я ничего не имею , а вот код, честно скажу, не знаю ...
В pEnum.Next параметры передают через OUT ( как я понял более "жестокая версия" Var) "умная компиляция" дельфи просто режет лишнее , а что делает FPC
( судя по ошибке ) "бабушка надвое сказала "... :roll:

Добавлено спустя 8 минут 3 секунды:
zub писал(а):Извращения - это когда кадр копипастишь через буфер обмена

Согласен, но что было делать если иначе со старой камерой ничего не работало ?

ЗЫ
"Ошибки со строкой" просто нет РунТайм причем не ошибка просто сообщение . (там где собрал все работает, а на планшете лазарус пока не ставил ... )
Код: Выделить всё
procedure TForm1.FormCreate(Sender: TObject);
begin
CoInitialize(nil);// инициализировать OLE COM
//вызываем процедуру поиска и инициализации устройств захвата видео и звука
if FAILED(Initializ) then
    Begin
      ShowMessage('Внимание! Произошла ошибка при инициализации');
      Exit;
    End;
//проверяем найденный список устройств
if Listbox1.Count>0 then
    Begin
        //если необходимые для работы устройства найдены,
        //то вызываем процедуру построения графа фильтров
        if FAILED(CreateGraph) then
            Begin
              ShowMessage('Внимание! Произошла ошибка при построении графа фильтров');
              Exit;
            End;
        Panel2.Caption:='Режим просмотра';
    end else
            Begin
              ShowMessage('Внимание! Камера не обнаружена.');
              //Application.Terminate;
            End;
end;

Последний раз редактировалось Alex2013 11.05.2017 19:29:32, всего редактировалось 1 раз.
Alex2013
энтузиаст
 
Сообщения: 664
Зарегистрирован: 03.04.2013 11:59:44

Re: Windows 10 и захват кадра из видеопотока с камеры ....

Сообщение zub » 11.05.2017 19:28:35

>>Посмотри как у меня сделано ...
В исходнике туда передается nil. ты передаешь какойто указатель на чтото. я надеюсь там где (...) ты заполняешь ff1? если нет, то и неработает оно у тебя потому что получает на входе мусор!
Единственный способ передать туда nil это его разименовать - ТНужныйТип(nil^) или PТНужныйТип(nil)^ что в данном случае однотрибукственно. Естественно процедура принимающая такой параметр должна быть к этому готова. судя по делфи коду .Next к этому готов.
Никаких проблем в данном случае с подобной конструкцией быть не должно

Добавлено спустя 4 минуты 35 секунд:
>>В pEnum.Next параметры передают через OUT
В pEnum.Next параметры передают через указатель. Это какието умники заменили на более "безопасную" и "высокоуровневую" конструкцию, но забыли что при этом штатными способами туда теперь nil не передать.
Последний раз редактировалось zub 11.05.2017 19:36:24, всего редактировалось 1 раз.
zub
долгожитель
 
Сообщения: 2134
Зарегистрирован: 14.11.2005 23:51:26

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google Adsense [Bot] и гости: 5

Рейтинг@Mail.ru