Webkamera mozgásérzékelő :-))
2004-01-03T23:17:04+01:00
2009-11-03T15:34:25+01:00
2022-07-25T09:31:23+02:00
  • Üdv !

    És ez ?
    Mutasd a teljes hozzászólást!
  • Én a magáncélra ingyenes VisionLab-ot használom:
    http://www.mitov.com/html/visionlab.html
    Üdv.
    Mutasd a teljes hozzászólást!
  • Hello!

    Én is ilyesmiben gondolkodom, mint a topic indíto emberke, annyi különbseggel, hogy én a mozgás helyét szeretném megtudni (ha az ajtónal mozog valami, vagy ha az asztalnál, ilyesmi kb). De nekem az lenne a kérdésem, hogy ha egy mozgasérzékelőt a géphez kötök, akkor nem lehetne valahogy ellenőrizni, hogy milyen iranyból érzékelte a mozgást? Vagy csak annyit küld, hogy valami megmozdult? Itt most elsősorban mikrohullámú vagy ultraszonikus kütyükre gondolok. Vagy esetleg létező más típusra, amiről esetleg nem hallottam :)
    Mutasd a teljes hozzászólást!
  • Capture.pas

    unit Capture; interface uses Windows, SysUtils, Messages, Classes, Graphics; type TOnCaptureReady = procedure(Sender: TObject;CameraMatrix:Pointer) of object; function CameraOpen(Handle:HWND;OnCaptureReady:TOnCaptureReady;Width,Height:integer):boolean; Procedure CameraClose; Procedure CameraCaptureStart(bm:TBitmap); Procedure CameraSourceDialog; Procedure CameraFormatDialog; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ implementation //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ const WM_CAP_START = WM_USER; WM_CAP_STOP = WM_CAP_START + 68; WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10; WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11; WM_CAP_GRAB_FRAME = WM_CAP_START + 60; WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5; WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41; WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42; WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44; WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45; type PVIDEOHDR = ^TVIDEOHDR; TVIDEOHDR = record lpData : PBYTE; // pointer to locked data buffer dwBufferLength : DWORD; // Length of data buffer dwBytesUsed : DWORD; // Bytes actually used dwTimeCaptured : DWORD; // Milliseconds from start of stream dwUser : DWORD; // for client's use dwFlags : DWORD; // assorted flags (see defines) dwReserved : array[0..3] of DWORD; // reserved for driver end; var hWndC : HWND; fOnCaptureReady : TOnCaptureReady=nil; fWidth : integer; fHeight : integer; wxh : integer; fbm : TBitMap; //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ function capCreateCaptureWindowA(lpszWindowName : PCHAR; dwStyle : longint; x : integer; y : integer; nWidth : integer; nHeight : integer; ParentWin : HWND; nId : integer): HWND; STDCALL EXTERNAL 'AVICAP32.DLL'; //------------------------------------------------------------------------------ function FrameCallback(hCapWnd: HWnd; lpVHDR: PVideoHdr): DWord; stdcall; far; var xx,yy,r,g,b,y,u,v :integer; pY,pU,pV,pUU,pVV :pByte; Adder :integer; p :pByte; vhdr :TVIDEOHDR; begin if hCapWnd = 0 then Begin Result:=0; exit; end; vhdr:=lpVHDR^; Adder:=fWidth shr 1; pY:=vhdr.lpData; pUU:=vhdr.lpData; inc(pUU,wxh); pVV:=vhdr.lpData; inc(pVV,wxh+wxh shr 2); fbm.Width:=fWidth; fbm.Height:=fHeight; fbm.PixelFormat:=pf24bit; p:=fbm.ScanLine[fHeight-1]; for yy:=0 to fHeight-1 do begin pu:=puu; pv:=pvv; for xx:=0 to fWidth-1 do begin y:=pY^-16; u:=pU^-128; v:=pV^-128; r:=(y*298+ v*409 ) div 256; g:=(y*298-u*100-v*208 ) div 256; b:=(y*298+u*516 ) div 256; if b<0 then b:=0; if b>255 then b:=255; if g<0 then g:=0; if g>255 then g:=255; if r<0 then r:=0; if r>255 then r:=255; p^:=b;inc(p); p^:=g;inc(p); p^:=r;inc(p); inc(vhdr.lpData); if (xx and 1)=1 then begin inc(pU); inc(pV); end; inc(pY); end; if yy and 1 = 1 then begin inc(puu,Adder); inc(pvv,Adder); end; end; Result := 1; if Assigned(fOnCaptureReady) then fOnCaptureReady(nil,Pointer(lpVHDR^.lpData)); end; //------------------------------------------------------------------------------ function CameraOpen(Handle:HWND;OnCaptureReady:TOnCaptureReady;Width,Height:integer):boolean; var CaptureBIHSize : integer ; PCaptureBIH : PBitmapInfoHeader; // capture bmp format info begin result:=false; fWidth :=Width; fHeight:=Height; wxh:=fWidth*fHeight; fOnCaptureReady:=OnCaptureReady; hWndC := capCreateCaptureWindowA('My Own Capture Window', WS_CHILD {or WS_VISIBLE} , 0, 0, fWidth, fHeight, Handle, 0); if hWndC <> 0 then begin SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME, 0, LPARAM(@FrameCallback)); CaptureBIHSize := SendMessage(hwndc, WM_CAP_GET_VIDEOFORMAT, 0, 0); GetMem(PCaptureBIH, CaptureBIHSize); SendMessage(hwndc, WM_CAP_GET_VIDEOFORMAT, CaptureBIHSize, LPARAM(PCaptureBIH)); PCaptureBIH.biSize:=CaptureBIHSize; PCaptureBIH.biWidth:=fWidth; PCaptureBIH.biHeight:=fHeight; PCaptureBIH.biPlanes:=1; PCaptureBIH.biBitCount:=12; PCaptureBIH.biCompression:=808596553; PCaptureBIH.biSizeImage:=fWidth*fHeight*PCaptureBIH.biBitCount div 8; PCaptureBIH.biXPelsPerMeter:=0; PCaptureBIH.biYPelsPerMeter:=0; PCaptureBIH.biClrUsed:=0; PCaptureBIH.biClrImportant:=0; SendMessage(hwndc, WM_CAP_SET_VIDEOFORMAT, CaptureBIHSize, LPARAM(PCaptureBIH)); FreeMem(PCaptureBIH); result:=true; end; end; //------------------------------------------------------------------------------ Procedure CameraClose; begin if hWndC <> 0 then begin SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); hWndC := 0; end; end; //------------------------------------------------------------------------------ Procedure CameraCaptureStart(bm:TBitMap); begin fbm:=bm; if hWndC <> 0 then PostMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0); end; //------------------------------------------------------------------------------ Procedure CameraFormatDialog; begin SendMessage(hwndC, WM_CAP_DLG_VIDEOFORMAT, 0, 0); end; //------------------------------------------------------------------------------ Procedure CameraSourceDialog; begin SendMessage(hwndC, WM_CAP_DLG_VIDEOSOURCE, 0, 0); end; //------------------------------------------------------------------------------ end.


    Példa a használatára:


    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,Capture, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } Procedure FelDolg(Sender: TObject;CameraMatrix:Pointer); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const w=320; h=240; c=w*h; var bm : tBitMap; bb:array[0..c-1] of byte; bk:array[0..c-1] of byte; p:pByteArray; procedure TForm1.FelDolg(Sender: TObject;CameraMatrix:Pointer); begin Form1.Canvas.Draw(0,0,bm); end; procedure TForm1.FormCreate(Sender: TObject); begin bm:=TBitMap.Create; bm.Width:=w; bm.Height:=h; bm.PixelFormat:=pf24bit; bm.Palette:=0; CameraOpen(Form1.Handle,Form1.FelDolg,w,h); end; procedure TForm1.FormDestroy(Sender: TObject); begin CameraClose; bm.Free; end; procedure TForm1.Button2Click(Sender: TObject); begin CameraFormatDialog; end; procedure TForm1.Button3Click(Sender: TObject); begin CameraSourceDialog; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.Enabled:=false; CameraCaptureStart(bm); Timer1.Enabled:=true; end; end.
    Mutasd a teljes hozzászólást!
  • Már nem emléxem, pontosan melyik komponenst használtam, de valamelyik VFW (Video For Windows) kezelő cucc volt. Ma már elég elavult megoldás a VFW, mert a capture kártyát DirectShow -n szokták elérni Windows alatt, az sokkal gyorsabb és többet tud. De a lényegük ezeknek kb. ugyanaz. Van egy onFrame esemény, az jelzi, hogy ha bejött egy képkocka a capture drivertől, és azt odateszi egy TBitmap -re. Legalábbis én ilyet használtam. Van függvény, amivel be lehet hozni a driver beállító ablakát, meg egy másik, amivel a képformátum-kiválasztót.
    Mutasd a teljes hozzászólást!
  • Hali!
    Én próbáltam Delphiböl elérni a WebCam-ot, de nem sikerült...
    Valakinek van valami honosított verziója? mert amit a neten találtam az már alapból lehalt mindenféle verziókülönbségek miatt, és idegileg nem bírtam tovább... lehet, ha anyagi érdeke lenne, akkor jobban is megeröltettem volna magamat, de így magáncélra, szórakozásképp, nem volt kedvem több idöt rászánni a keresésre...
    Mutasd a teljes hozzászólást!
  • engem is
    Mutasd a teljes hozzászólást!
  • Tudom hogy már ezeréves a téma, de akkoris megvan valakinek az a kapcsolási rajz??? Engem érdekelne...
    Mutasd a teljes hozzászólást!
  • Pár éve Delphiben kellett ilyet írnom egy bolt számára. A cél az volt, hogy a kirakat előtt járkáló embereket jól lefényképezze, miután kellőképpen beértek a képbe, és kitegye a képernyőre az előző pár másik mellé. Ezután csak egy beállítható időtartam után "érzékenyedett újra".

    Az én mozgásérzékelési elvem az volt, hogy a képeket 2-3 fps sebességgel szedtem be, és leszkéleztem kb. 10*10 pixelesre. (persze supersampling -gel, mert épp az a lényeg, hogy a zajt meg az inszignifikáns mozgásokat kiszűrjük.) A kicsinyített képeket eltároltam egy pufferbe, és az aktuálisat egy pár másodperccel korábbival hasonlítottam össze, és ha elég nagy a változás, akkor tekintettem mozgásnak. Ezzel a lassú változásokat nem érzékelte, úgyhogy nyugodtan lemehetett a Nap, sőt, fel is kelhetett, az nem érdekelte.

    Egy kiskép-pár összehasonlítása meg úgy történt, hogy a megfelelő pixeleik fényesség-különbségeinek az abszolút értékét összegeztem. A módszer bevált. A beállítópanelen egy csík mutatta folyamatosan a detektált mozgásmennyiséget, és slider -ekkel lehetett a konstans paramétereket hangolni, amíg az adott terepviszonyoknak meg nem felelt a konfiguráció. Egy elég kis gagyi webkamerával teszteltem, de azzal is jó eredményt adott.

    Mondjuk hogy ez 1-2% procival kijön-e, azt nem tudom, de ha az ember nem használja az összes pixelt a kamera képéről, csak minden n -ediket, akkor talán ki lehet hozni.
    Mutasd a teljes hozzászólást!
  • Én úgy oldottam meg a problémát, hogy:
    minden hétköznap 7:00-tól 16:00-ig a WebcamXP nevű program figyeli a terepet; mozgás esetén egy email-t küld, amiben mellékletként szerepel a kép is.
    Az ajtó kinyitását egy tárgyreflexiós szenzor figyeli. A szenzor egy PLC bemenetére van kötve. Amennyiben az ajtót kinyitják (természetesen hétköznap 7-16), akkor a PLC a PC-nek küld egy jelzést (soros port), amit egy általam írt program feldolgoz és a telefonszámomra küld egy SMS-t.


    A rendszer segítségével már sikerült behatolókat rajtakapnom, a képek pedig bizonyítékként szolgáltak.

    A rendszer szünetmentes áramforrásról üzemel, tehát rövidebb-hosszabb áramszünetek sem jelentenek gondot!
    Mutasd a teljes hozzászólást!
  • Hi!

    Miért nem jó pl. DivX tömörítés??? Ha a képen nincs elmozdulás, a 1 képkocka kb 50-200 bájtot foglal el. Ráadásul keveset is eszik (3GHz procin ). A webcam képe nem szok 640x480-nál nagyobb lenni, szal ez az ecceű út.
    Mutasd a teljes hozzászólást!
  • Na ha már feljött a téma, akkor egy észrevétel:

    Mozgásérzékelőnek használni a webcam-et szvsz butaság. Erre van a 2-3e forintos mozgásérzékelő. (az az ötlet külön tetszett, hogy egy mágnest tegyünk az ajtóba, és ha valaki kinyitja, akkor kapcsoljon be a kamera.... Minek? Hogy megállapítsa, hogy valaki kinyitotta az ajtót?


    Viszont egy nagyon hasznos dologról hallottam úgy kábé egy éve:

    írtak egy olyan progit, ami a kamera képe alapján eldönti, hogy ég-e tűz a megfigyelt területen. Így a többtucat kamerát néző (illetve persze csak TV-t néző) biztonsági őr, percekkel korábban értesülhet a tűzről, mint egy füstérzékelős rendszer esetében.
    Mutasd a teljes hozzászólást!
  • Flashben a kamera aktivítását kb 2 sor segítségével fel lehet dolgozni, volt is már róla szó itt a fórumon.. ha jó így is neked..
    Mutasd a teljes hozzászólást!
  • Engem érdekel a dolog, csak hogy tudod megvizsgálni, hogy az adott területen váltonak-e a színek? Van ennek valahol leírása?
    Mutasd a teljes hozzászólást!
  • Ilyen progi egyebkent mar letezik.
    CrimeCather
    Mutasd a teljes hozzászólást!
  • Na, szerdán ha minden jól megy, belevágok
    Mutasd a teljes hozzászólást!
  • Hi!

    Eccerű otthon kamera nélkül is célhw-t csinálni, ami infrakapuként műxik. Elkezdtem gyártani egy ilyet, a vevő marha jól megy, a TV távirányítót 5-6 méterről jelzi, mint állat! Az adó kicsit gyenge.
    Ha valaki belép a kettő közé, ugyebár megszakad a jel, 1-re vált egy kimenet...

    Ha valakinek kell kapcsolási rajz, szójjon privátba'.

    Üdv.: Netom.
    Mutasd a teljes hozzászólást!
  • Nem azert, de mi van, ha elviszi a komplett gepet? (:

    Jo mondjuk betorok ellen nem jo, de pl.: munkahelyen meg lehet nezni ki turkal. (:
    Mutasd a teljes hozzászólást!
  • Egyébként kösz az ötletet.
    Ha lesz pénzem kipróbálom
    Mutasd a teljes hozzászólást!
  • És ha el lenne helyezve a térben néhány fix pont (pl. piros lámpácskák),
    és csak ezeket figyelnéd?
    Egyetértek!
    DE piros helyett INFRAVÖRÖS LEDeket ajánlok.
    A KAMERA LÁTJA A BETÖRŐ NEM
    Mutasd a teljes hozzászólást!
  • Arról nem beszélve, hogy sötétben is fog működni...

    a webcam is csak infravörös fényforr. kell hozzá
    Mutasd a teljes hozzászólást!
  • Hali!

    Szerintem kösd egybe a kamerát egy mágnesérzékelős zárral. Ha kinyitja valaki az ajtót, akkor a mágneszár jelez, és indulhat a felvétel. Így amikor csukva az ajtó, akkor a proci szinte alszik. 0% lesz a leterheltsége. Ennek az ára szerintem 2-300 HUF. :)
    ui.: Persze ha a huzat nyitja ki az ajtót, akkor nem tom mi van.

    SONIC
    Mutasd a teljes hozzászólást!
  • A vazat / fenyvaltozast szvsz ugy lehetne kikuszobolni, hogy masodpercenkent lovunk egy kepet a kameraval es ezt osszehasonlitjuk az elozovel. Ha az elteres kevesebb, mint 10% akkor az elozo kepet eldobjuk es az ujat tartjuk meg. Ha tobb, mint 10% akkor riadoztatunk. A 10%-ot hasrautesszerunek mondtam, azt pontosan ki kellene tapasztalni, hogy mennyi az optimalis tureshatar. Persze igy valaki behatolhat, ha araszolva halad. De lehetne pl utolso 5 kep alapjan is nezni az eredmenyeket.
    Mutasd a teljes hozzászólást!
  • És ha el lenne helyezve a térben néhány fix pont (pl. piros lámpácskák),
    és csak ezeket figyelnéd?
    Mutasd a teljes hozzászólást!
  • RE!

    Gondolkodtam egy picit a torteneten. Szoval a kriterium az 1% prociido, es a valos mozgaserzekeles.

    1. Lattam mar megoldast arra, hogy kamera kepet egy Timage-re ratolni. Ez kb 30-40 sor delphiben. Ennek az a hatranya, hogy a Timage-rol a keppiszkalas azaz egy pixel kiszedese egy elegge prociigenyes feladat.

    2. Ha megvan a kep, akkor valami trafo kellene ra. Szerintem egy 16 szinu szurkeskalas atalakitas jo lenne, ilyenkor a zaj nagy resze eltunik. A legtobb kamera kepes 96*128-ba digizni. Igy egy 24576 hosszu byte tomben lehetne a kapott kepet tarolni. A problema tehat vissza van vezetve ket vektor osszehasonlitasara. A legtobb alakfelismeresi problema eseten ennek a vektornak a dimenzio szamat probaljak csokkenteni. Tehat egy olyan eljarast kellene talalni, mint mondjuk az osszes keppont fenyessegenek az atlaga vagy valami hasonlo. Azaz valahogy tovabbi jellemzoket kellene kinyerni talan 4-5 jellemzo eleg lenne. Mondjuk él kereses, bar ez proci igenyes. Majd az igy kapott vektorokon elvegezni az osszehasonlitast, es az adott kepet besorolni egy osztalyba a ketto kozul
    -volt mozgas
    -nincs mozgas.

    Ugy korulbelul ennyi. Szvsz jol megcsinalni tenyleg nem egyszeru, majd irj, hogy mire jutottal.
    Mutasd a teljes hozzászólást!
  • Ok. csak azt ne felejtsd el, hogy kis számú pixelből nem tudod megmondani, mi történik a képen.
    Másrészt meg nem kis számű pixelt javaslok, mert akkor a zajokat is mozgásként érzékeli, hanem kis területeket (10x10 vagy 20x20).
    Mutasd a teljes hozzászólást!
  • Nem túl bíztató hírek, de azért egykönnyen nem adom fel... Még mindig úgy gondolom, hogy amit a topiknyitó hozzászólásban felvázoltam, az működőképes lehet. Tehát csak kisszámú képpontot hasonlítok össze az előző képkockával, s csak akkor van riasztás, ha valamelyik képpont színe jeletősen (5-10-20%, majd ki kell játszani mennyi legyen) megváltozik. Ez nem lenne érzékeny a napszak változásra, hisz az előző képkockához képest nincs gyors változás. Nem lenne érzékeny anyuka vázájára, hisz az előző képkockához hasonlít. A mozgás sebessége, meg iránya annyira nem lényeges, meg mint írtátok, amúgy is atomerőmű kell az élszűréshez, másfelől egy webkamera zajos képén nem is tudom, hogy működne-e ez. Tehát nem MI-t akarok írni ami megmondja, mit csinálnak a képen, csak azt hogy lássa hogy csinálnak valamit. A többi a videófelvételt visszanézők dolga...

    Azért elgondolkodtató netom ötlete, hogy kisméretű képet kérjek be a webkamerától. Windowsban még nem láttam ilyent, még a kamera gyári programja is csak pár standard nézettel tudnak dolgozni, a legkisebb is 352 képpont széles, de linuxban a motv (vagy modtv, nem vagyok biztos a névben) tudta azt, hogy akárhogy méreteztem az ablakot, olyan méretű képet kért a hardwertől, tehát nem szoftveresen méretezte át. Ezt nem tudom, windowsban lehet-e, amit eddig láttam delphi komponenseket mind csak 3-4 beállítást kínálnak fel felbontásra, 10x10 pixel pedig nincs köztük...

    Sajnos most nem érek rá nekiülni a programnak, majd kb. 1 hét múlva. Mindenkit tájékoztatok majd hogy mi lesz. Addig is az 5leteket ne tartsátok magatokba...
    Mutasd a teljes hozzászólást!
  • :) először gondold végig, amit írni akarsz, aztán még1x, s csak utánna írd le. :)
    Mutasd a teljes hozzászólást!
  • télleg. derossz.... mondani kell anyádnak, hogy ne hozzon be vázát a szobádba... különben megtelik a vinyód
    Mutasd a teljes hozzászólást!
  • 1: van egy képed a szobáról
    2: bejön valaki, lerak egy vázát
    ezt rögzíti a kamera, mert érzékeli, hogy mozgás volt
    3: kimegy az illető.
    4: nincs mozgás, de a kamera mindent mozgásnak fog fel, mert az új váza miatt minden képen eltér az új kép a temp-től....

    szóval ez hülyeség már ne is haragudj...
    Mutasd a teljes hozzászólást!
abcd