Captați video de la camerele web și detectați mișcarea

Deci, fără să mai vorbim, să începem.

Creați și adăugați modulul AviCap32Unit.pas la proiect. unde descriem funcțiile și constantele externe ale bibliotecii AVICAP32.DLL. Avem nevoie de două funcții: capGetDriverDescriptionA și capCreateCaptureWindowA. Pentru ceea ce sunt necesare - îți voi spune mai târziu. De asemenea, avem nevoie de 4 mesaje: WM_CAP_START. WM_CAP_DRIVER_CONNECT. WM_CAP_GRAB_FRAME și WM_CAP_STOP.







Codul modulului AviCap32Unit:

Codul modulului CamCaptureUnit:

După cum puteți vedea, există două clase aici - TCamera și TCamList. Metoda cea mai necesară pentru noi este TCamera.CaptureBMP. Acesta implementează captura cadrului de la cameră.

Atunci când creați un formular, sortați prin camerele din sistem:

Când faceți clic pe "Start" - porniți camera:

De cronometru vom obține imaginea:

Am încercat să compilez, nimic nu se întâmplă:
În primul rând, nu compilează erori în modulul detector
plictisit cum putea de la proiect (nu este necesar)
programul a fost compilat și început, dar nu a devenit mai ușor
Am 2 dispozitive în sistem și în listă există doar un singur Microsoft WDM și așa mai departe.
și un ecran alb în locul unei imagini
vă rugăm să ajutați, grabber foarte necesar
dacă este posibil, mai bine prin e-mail
Cu stimă,
Kotovich

Prompt, vă rog, la compilarea programului Delphi (7) să jurați pe liniile care conțin "ieșire (0)" și "ieșire (falsă)", respectiv "Operator lipsă sau punct și virgulă". Cum puteți remedia această eroare? Vă mulțumim anticipat.

tomskfarm, ieșirea cu un parametru este posibilă numai în Delphi din versiunea XE.
Pentru Delphi 7 scrie

Ai o zi frumoasă!
În primul rând: mulțumesc pentru munca grea, foarte interesant!

Dmitry, folosește tampon dublu

Conservate, și pot mai multe detalii?
1) cum să implementați tampon dublu
2) cum ar putea ajuta acest lucru sau, din ce motiv, este observat un astfel de efect?

Nu am acest efect, dar am întâlnit adesea că, odată cu unele setări de sistem de operare, "clipește".

Acest lucru se datorează faptului că procesul de desenare a unei imagini necesită ceva timp și acest proces este vizibil pe ecran.

Ar trebui să vă uitați în direcția timerului (CamTimer1Timer). Cel mai probabil este Image1.Picture.Assign (bmp); Încercați să utilizați mecanismul intern dublu de tamponare Delphi:

sau trageți manual pe panza cu BitBlt.

Conserve, mulțumesc, a ajutat. Cred că această modificare poate fi adăugată la corpul articolului)

Ai o zi frumoasă!
Acum a apărut o altă problemă, după aproximativ o oră de programare programul se blochează, imaginea îngheață, ceasul de pe formular este de asemenea înghețat, nu mai vrea să lucreze mai departe.
Judecând după simptom, ceva se revarsă undeva.
Ai idee unde să te uiți în acest caz?
Mulțumesc în prealabil, cu respect, Dmitry.

A încercat să facă Cam.Stop cu Cam.Start ulterior, dar în conformitate cu codul dat Cam.Stop nu funcționează deloc din anumite motive.







funcția TCamera.Stop (): boolean;
începe
dacă (Fh<>0) atunci
începe
TrimitereMessage (Fh, WM_CAP_STOP .0, 0);
CloseHandle (Fh);
Fh: = 0;
se încheie;
se încheie;

se blochează cu eroare Proiectul a ridicat clasa de excepție $ C0000008 cu mesajul "excepție de sistem (cod 0xc0000008) la 0x771112f7"

Am găsit o eroare în codul dvs., chiar dacă faceți o curățare a obiectului, memoria va fi în continuare încărcată! Pentru a evita această problemă, aș recomanda curățarea obiectelor din timer, unde sunt create.

procedura TMainFormCamera.CamTimer1Timer (Expeditor: TObject);
var BMP, orig. TBitmap;
începe
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;

Bine ai venit! Spuneți-mi cum să eliminați imaginea de pe camera web, să o împingeți în TMemoryStream și să o difuzați, să spunem pe client (TCPServer / TCPClient)?

@Serega
Vă voi spune pe scurt:
cam.CaptureBMP (bmp);
bmp.savetostream (flux);

Apoi ne transmitem fluxul prin protocolul său către TCPServer / TCPClient.

Mai bine, bineînțeles, pre-codificați în JPEG.

Program foarte cool. Chiar vreau să înțeleg, dar nu pot compila programul, dă erori pe care nu le știu cum să le rezolv. Resetați programul la codul de e-mail. Voi fi foarte recunoscător

Bine ai venit! Mi-a plăcut foarte mult programul. Voiam să înțeleg cum funcționează, dar nu pot să compilez. Resetați programul la codul de e-mail. Voi fi foarte recunoscător

@Patrik
Legăturile la sursă și la EXE-shnik sunt la sfârșitul articolului.

Delphi 7 este deja foarte învechit, este mai bine să utilizați versiunea mai mult sau mai puțin modernă.

Despre ecranul negru. 1. Ați apăsat butonul "Start"?
2. Ați închis aparatul incorect ultima oară sau camera web este deja utilizată de alte programe? Reporniți computerul și executați programul "curat". Încercați-l pe alt computer.
3. Webcam-ul este configurat și funcționează? Alte programe pentru lucrul cu camera foto?
4. Care este versiunea dvs. de Windows?

Recent am aflat că fotografia de pe cameră este eliminată, dar nu este afișată în Imagine. În ce poate fi o afacere?

Bună ziua, cum să schimb corect rezoluția aparatului foto? Când înlocuiți rânduri în modulul CamCaptureUnit
FWidth: = 1280;
FHeight: = 800;
Not full Imaginea este afișată, imaginea durează aproximativ un sfert. Pentru Image a făcut o redimensionare sub 1280x800. Camera foto acceptă această rezoluție și o verifică.

@ Anatoly
E ciudat. Ar trebui să lucreze.

Am 640x480. Nu pot verifica camera "mai mare", din păcate.

@Patrik
Biblioteca AVICAP32 este depășită. Am observat probleme când programul a fost închis incorect (fără butonul de trimitere al mesajului WM_CAP_STOP). Au existat probleme la redeschiderea programului.

AVICAP32 este mai mult, jucați. Proiecte serioase (cum ar fi Skype) utilizează DirectShow. Nu am nici o experiență folosind DirectShow.

Vă mulțumim pentru răspuns. Este regretabil faptul că suportul AVICAP32 nu mai este disponibil.
Doar că totul este bine aranjat aici.

Bună ziua. Spuneți când sunați
Fh: = capCreateCaptureWindowA ("test", WS_VISIBLE sau WS_CHILD, 10000,10000, FWidth, FHeight, GetDesktopWindow, 0);
Se deschide o nouă fereastră, chiar dacă fereastra se află în afara ecranului (coordonate 10000,10000), pe bara de activități este vizibilă. Ar trebui să-l ascund cumva?

Înțeleg, dacă cineva trebuie, apoi după
Fh: = capCreateCaptureWindowA ("test", WS_VISIBLE, 10000,10000, FWidth, FHeight, GetDesktopWindow, 0);

adăuga
ShowWindow (Fh, SW_HIDE);
SetWindowLong (Fh, GWL_EXSTYLE,
GetWindowLong (Fh, GWL_EXSTYLE) SAU WS_EX_TOOLWINDOW);
ShowWindow (Fh, SW_SHOW);

Am deschis programul pe un delfi XE 5. Dar nu se compilează. Aici o astfel de eroare pleacă. Modul de încărcare: CLBCatQ.DLL. Nu există informații despre depanare. Adresa de bază: $ 76FD0000. Procesați WebCam.exe (1980). Am facut Configurarea Build on Release. și Debug. Dar încă un fel de astfel de greșeli. Ce să faceți. Ajută-mă, salut!

XE3 merge deodată:







Articole similare

Trimiteți-le prietenilor: