Захоплення відео з web камери і детектор руху

Отже, без зайвих слів, приступимо.

Створимо і додамо в проект модуль AviCap32Unit.pas. де опишемо зовнішні функції і константи бібліотеки AVICAP32.DLL. Нам знадобляться дві функції: capGetDriverDescriptionA і capCreateCaptureWindowA. Для чого вони потрібні - розповім пізніше. Ще нам потрібні 4 повідомлення: WM_CAP_START. WM_CAP_DRIVER_CONNECT. WM_CAP_GRAB_FRAME і WM_CAP_STOP.

Код модуля AviCap32Unit:

Код модуля CamCaptureUnit:

Як бачите, тут є два класи - TCamera і TCamList. Найнеобхідніший для нас метод - TCamera.CaptureBMP. Він реалізує захоплення кадру з камери.

При створенні форми, перебираємо камери в системі:

При натисканні на «Старт» - запускаємо камеру:

За таймером отримуємо картинку:

пробував скомпілювати, нічого не виходить :(
по-перше, не компілюється, помилки в модулі детектора
викуси як міг його з проекту (не потрібен),
програма відкомпільоване і запустилася, але легше не стало
у мене в системі 2 пристрої, а в списку тільки одна Microsoft WDM і т.д.
і білий екран замість картинки
будь ласка, допоможіть, дуже потрібен граббер
якщо можливо, краще на е-пошту
З повагою,
Котович

Підкажіть, пожалуйста- при компіляції програми Delphi (7) лається на рядки, що містять "exit (0)" і "exit (false)", а саме "Missing operator or semicolon". Як можна виправити цю помилку? Заздалегідь дякую.

tomskfarm, exit з параметром можливий лише в Delphi починаючи з версії XE.
Для Delphi 7 пишіть

Доброго дня!
По-перше: спасибі за працю, дуже цікаво!

Дмитро, використовуйте подвійну буферизацію

Консерв, а можна докладніше два моменти?
1) як реалізувати подвійну буферизацію
2) яким чином це повинно допомогти, або, з якої причини зараз спостерігається такий ефект?

У мене цей ефект не спостерігається, але я часто зустрічав, що при деяких налаштуваннях ОС буває "моргання".

Це відбувається тому, що процес промальовування картинки займає деякий час і цей процес бачимо на екрані.

Вам слід дивитися в бік обробника таймера (CamTimer1Timer). Найімовірніше грішить Image1.Picture.Assign (bmp); Спробуйте використовувати внутрішній механізм подвійної буферизації Delphi:

або вручну малювати на канві за допомогою BitBlt.

Консерв, спасибі, це допомогло. Думаю, цю модифікацію можна додати в тіло статті)

Доброго дня!
Тепер вилізла інша проблема, через приблизно годину роботи програми програма висне, зображення заморожується, годинник на формі теж заморожуються, працювати ця справа далі не хоче.
Судячи по симптому, щось десь переповнюється.
Є ідеї куди дивитися в такому випадку?
Заранее спасибо, з повагою, Дмитро.

Намагався зробити Cam.Stop з подальшим Cam.Start, але за наведеним кодом Cam.Stop взагалі не відпрацьовує чомусь.

function TCamera.Stop (): boolean;
begin
if (Fh<>0) then
begin
SendMessage (Fh, WM_CAP_STOP. 0, 0);
CloseHandle (Fh);
Fh: = 0;
end;
end;

вилітає з помилкою Project raised exception class $ C0000008 with message 'system exception (code 0xc0000008) at 0x771112f7'

Я у вас в коді знайшов помилку, навіть якщо на вашу зробити очищення об'єкту пам'ять буде все одно завантажуватися! Для уникнення це проблеми я радив би очищати об'єкти в таймері, де вони і створюються.

procedure TMainFormCamera.CamTimer1Timer (Sender: TObject);
var BMP, orig. TBitmap;
begin
bmp: = TBitmap.Create;
bmp.PixelFormat: = pf24bit;
cam.CaptureBMP (bmp);
orig: = TBitmap.Create;
orig.Width: = bmp.Width;
orig.Height: = bmp.Height;
orig.Assign (bmp);
orig.Free;
bmp.free;

Вітаю! Підкажіть будь ласка, як з Web-камери зняти зображення, засунути в TMemoryStream і транслювати його, припустимо на клієнт (TCPServer / TCPClient)?

@Serega
Розповім коротко:
cam.CaptureBMP (bmp);
bmp.savetostream (stream);

Далі транслюємо наш stream за своїм протоколу в TCPServer / TCPClient.

Краще, звичайно, попередньо перекодувати в JPEG.

Дуже прикольна програма. Дуже хочу в ній розібратися але я не можу скомпілювати програму видає помилки які я не знаю як виправити. Будь ласка скиньте програму з кодом на пошту. Буду дуже вдячний

Вітаю! Дуже сподобалася програма. Хотів розібратися як вона працює але не можу откомпеліровать. Будь ласка скиньте програму з кодом на пошту. Буду дуже вдячний

@Patrik
Посилання на исходник і EXE-шник є в кінці статті.

Delphi 7 вже дуже сильно застаріла, краще використовуйте будь-яку більш-менш сучасну версію.

З приводу чорного екрану. 1. Ви кнопку "Start" натискали?
2. Можливо, ви некоректно закрили пристрій в минулий раз або веб-камера вже використовується іншими програмами? Перезавантажте комп'ютер і запустіть програму "начисто". Спробуйте на іншому комп'ютері.
3. Веб камера налаштована і працює? Інші програми для роботи з камерою працюють?
4. Яка у вас версія Windows?

Нещодавно дізнався що картинка з камери знімається але не виводиться на Image. У чому може бути справа?

Привіт, як коректно поміняти дозвіл камери? При заміні в модулі CamCaptureUnit рядків
FWidth: = 1 280;
FHeight: = 800;
Відображається не повний Image, картинка займає приблизно чверть. Для Image зробив ресайз під 1280х800. Камера підтримує такий дозвіл, перевіряв.

@ Анатолій
Дивно. Повинно працювати.

У мене 640x480. Перевірити на "більшої" камері, на жаль, не можу.

@Patrik
Бібліотека AVICAP32 застаріла. Я помічав проблеми при неправильному закриття програми (без кнопки відправки повідомлення WM_CAP_STOP). Бували проблеми при повторному відкритті програми.

AVICAP32 - це більше так, погратися. Серйозні проекти (типу Skype) використовують DirectShow. Досвіду використання DirectShow у мене немає.

Спасибі за відповідь. Дуже шкода що підтримка AVICAP32 більше немає.
Просто тут все добре розписано.

Доброго дня. Скажіть при виклику
Fh: = capCreateCaptureWindowA ( 'test', WS_VISIBLE or WS_CHILD, 10000,10000, FWidth, FHeight, GetDesktopWindow, 0);
Відкривається нове вікно, не дивлячись на те що вікно за межами екрану (координати +10000,10000), на панелі завдань воно видно. Иожно якось приховати його?

Розібрався, якщо комусь потрібно буде, то після
Fh: = capCreateCaptureWindowA ( 'test', WS_VISIBLE, 10000,10000, FWidth, FHeight, GetDesktopWindow, 0);

додайте
ShowWindow (Fh, SW_HIDE);
SetWindowLong (Fh, GWL_EXSTYLE,
GetWindowLong (Fh, GWL_EXSTYLE) OR WS_EX_TOOLWINDOW);
ShowWindow (Fh, SW_SHOW);

Я відкрив програму на дельфи ХЕ 5. Але не компілюється. Ось така помилка виходить. Module Load: CLBCatQ.DLL. No Debug Info. Base Address: $ 76FD0000. Process WebCam.exe (1980). Я зробив Build Configuration на Release. і на Debug. Але все одно якісь ось такі помилки. Що робити. Допоможи пожалюсто

XE3 збирається на раз:

Схожі статті