Surprise - Raumüberwachung, Einbruchschutz, Webcam

Anwendungen, Tools, Userlibs und anderes nützliches.
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von Frabbing »

Wenn jetzt jemand eine Minute vor der Kamera rumhampelt hab ich ja 10 Videodateien.
Das wird aber auch nicht anders sein, wenn sich die Kamera bei Nichtbewegung abschaltet. Es sei denn, die Person bewegt sich die ganze Zeit nicht. Aber dann wird ja jetzt auch nichts aufgezeichnet. Hat also keinerlei Vorteil, wie ich das sehe. Darum lass ich es erstmal so. 8)

Was mich mehr stört ist, dass wenn jemand schnell durchs Bild läuft, niemand aufgezeichnet wird, weil das Video unweigerlich zu spät startet. Ich suche jetzt eine Möglichkeit, das Video durch die schon vorher gemachten Bilder auszustatten, sodass die Bewegung in jedem Fall mit drin ist... :D
Gruß, Frank
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von dige »

Frabbing hat geschrieben: Das Clipboard wird jetzt gar nicht mehr zur Videobildübertragung genutzt, stattdessen verwende ich nun eine Lösung via Vfw, die mir die entsprechenden Codecs netterweise konvertiert. :mrgreen:
@Frank: dazu würde ich gern mehr erfahren. kannst du das bitte erläutern?
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von Rings »

Frabbing hat geschrieben:Was mich mehr stört ist, dass wenn jemand schnell durchs Bild läuft, niemand aufgezeichnet wird, weil das Video unweigerlich zu spät startet. Ich suche jetzt eine Möglichkeit, das Video durch die schon vorher gemachten Bilder auszustatten, sodass die Bewegung in jedem Fall mit drin ist... :D
Bau dir nen ringbuffer.
Sprich , zeichne immer (ca. 50-100 Bilder auf), so hast du ja immer 1-2 Sekunden Backup.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von Frabbing »

dige hat geschrieben:
Frabbing hat geschrieben: Das Clipboard wird jetzt gar nicht mehr zur Videobildübertragung genutzt, stattdessen verwende ich nun eine Lösung via Vfw, die mir die entsprechenden Codecs netterweise konvertiert. :mrgreen:
@Frank: dazu würde ich gern mehr erfahren. kannst du das bitte erläutern?
Mit Hilfe einiger msvfw32.dll-Funktionen lasse ich mir jeden ermittelten BITMAPINFOHEADER, der keine unkodierte RGB-Bitmap (z.B. YUV oder i420) beinhaltet, einfach in RGB24 umwandeln. Unterstützt werden tollerweise alle Codecs, die im System installiert sind. Hat den Vorteil, dass ich mich mit Codecs & Co gar nicht rumplagen muss und es klappt ja wohl wunderbar. :mrgreen:
Bau dir nen ringbuffer.
Sprich , zeichne immer (ca. 50-100 Bilder auf), so hast du ja immer 1-2 Sekunden Backup.
Bislang verwende ich die Message WM_CAP_SEQUENCE, die mir das Video nach meinen Parametern aufzeichnet. Ich dachte daran, in das fertige Video 25-30 Bilder vorne einzubauen. Wenn das nicht geht, muss ich das komplette Video selber zusammen bauen. Mal schauen, nächstes WE probier ich mich mal daran.
Gruß, Frank
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von dige »

Frabbing hat geschrieben: Mit Hilfe einiger msvfw32.dll-Funktionen lasse ich mir jeden ermittelten BITMAPINFOHEADER, der keine unkodierte RGB-Bitmap (z.B. YUV oder i420) beinhaltet, einfach in RGB24 umwandeln. Unterstützt werden tollerweise alle Codecs, die im System installiert sind. Hat den Vorteil, dass ich mich mit Codecs & Co gar nicht rumplagen muss und es klappt ja wohl wunderbar. :mrgreen:
Hast Du dazu Beispiele im Forum gefunden oder das selbst neu erarbeitet? Wäre prima wenn Du dazu was posten würdest. Danke!

Ciao Dige
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von Frabbing »

dige hat geschrieben:
Frabbing hat geschrieben: Mit Hilfe einiger msvfw32.dll-Funktionen lasse ich mir jeden ermittelten BITMAPINFOHEADER, der keine unkodierte RGB-Bitmap (z.B. YUV oder i420) beinhaltet, einfach in RGB24 umwandeln. Unterstützt werden tollerweise alle Codecs, die im System installiert sind. Hat den Vorteil, dass ich mich mit Codecs & Co gar nicht rumplagen muss und es klappt ja wohl wunderbar. :mrgreen:
Hast Du dazu Beispiele im Forum gefunden oder das selbst neu erarbeitet? Wäre prima wenn Du dazu was posten würdest. Danke!

Ciao Dige
Mein Code basiert auf sehr interessanten Anregungen, die ich im östereichischen VB-Sektor gefunden habe (unteren): http://www.visualbasic.at/forum/showfla ... mber=35474
Der Code dort macht eigentlich schon genau das, was ich oben beschrieben hatte. Ist recht leicht umzusetzen und ich hab ihn um allerhand Schnickschnack erweitert (Codecinfos, hbitmap usw.). Eben meinen Bedürfnissen angepasst. :)
Gruß, Frank
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von dige »

@Frank: Vielen Dank für den Tipp, das wäre echt genial wenn das so funktionieren würde.
Leider bekomme ich die DeCompression nicht hin. Das Handle zum Decompressor holen geht.
Aber wenn ich den DeCompressor aufrufe gibts nen IMA.
Nachfolgend ein so nicht lauffähiges Code-Fragement. *dibSav ist bereits allokiert.
Was mache ich falsch? Kannst Du mir helfen?

Code: Alles auswählen

Structure VIDEOHDR
  lpData.l          ; address of video buffer 
  dwBufferLength.l  ; size, in bytes, of the Data buffer 
  dwBytesUsed.l     ; Bytes used
  dwTimeCaptured.l  ; time in ms since start
  dwUser.l
  dwFlags.l
  dwReserved.l[4]
EndStructure

#ICERR_OK 			 			 = 0
#ICMODE_COMPRESS 			 = 1
#ICMODE_DECOMPRESS 		 = 2
#ICMODE_FASTDECOMPRESS = 3
#ICMODE_QUERY 				 = 4
#ICMODE_FASTCOMPRESS 	 = 5
#ICMODE_DRAW 					 = 8

#ICDECOMPRESS_HURRYUP  = 0

#ICM_COMPRESS_GET_FORMAT   = $4004
#ICM_COMPRESS_GET_SIZE 	   = $4005
#ICM_COMPRESS_QUERY 		   = $4006
#ICM_COMPRESS_BEGIN 		   = $4007
#ICM_COMPRESS 				     = $4008
#ICM_COMPRESS_END          = $4009
#ICM_DECOMPRESS_GET_FORMAT = $400A
#ICM_DECOMPRESS_QUERY 		 = $400B
#ICM_DECOMPRESS_BEGIN 		 = $400C
#ICM_DECOMPRESS 					 = $400D
#ICM_DECOMPRESS_END 			 = $400E

Macro MAKEFOURCC(ch0, ch1, ch2, ch3)
  (ch0 | (ch1 << 8)) | (ch2 << 16) | (ch3 << 24)
EndMacro

VfWLib = OpenLibrary(#PB_Any,"msvfw32.dll")
If VfWLib
	Global *IcOpen   = GetFunction(VfWLib, "ICOpen")
	Global *IcDeCmpr = GetFunction(VfWLib, "ICDecompress" )
EndIf

Procedure   CameraFrameCallback(hwnd.l, *lpVHdr.VIDEOHDR)
  Protected bmiOrig.BITMAPINFO, bmiDest.BITMAPINFO
   
	; Infos über das Bild/Videoformat holen um zu überprüfen ob die DIB
	; Section komprimiert ist
	SendMessage_ (hwnd, #WM_CAP_GET_VIDEOFORMAT, SizeOf(BITMAPINFO), @bmiOrig)
		
	If bmiOrig\bmiHeader\biCompression
		
		; Handle zum Decompressor to use
		hCI = CallFunctionFast(*IcOpen, MAKEFOURCC('V','I','D','C'), bmiOrig\bmiHeader\biCompression, #ICMODE_DECOMPRESS)
		If hCI
			bmiDest\bmiHeader\biSize = SizeOf(bmiDest\bmiHeader)
			bmiDest\bmiHeader\biWidth = bmiOrig\bmiHeader\biWidth
			bmiDest\bmiHeader\biHeight = bmiOrig\bmiHeader\biHeight
			bmiDest\bmiHeader\biCompression = 0
			bmiDest\bmiHeader\biBitCount = 24
			bmiDest\bmiHeader\biPlanes = 1
			bmiDest\bmiHeader\biSizeImage = bmiOrig\bmiHeader\biWidth * bmiOrig\bmiHeader\biHeight * 3
			; HIC HIC, DWORD dwFlags, LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData, LPBITMAPINFOHEADER lpbi, LPVOID lpBits);		
			; Debug SendMessage_ (hwnd, #ICM_DECOMPRESS_BEGIN, @bmiOrig\bmiHeader, @bmiDest\bmiHeader)
			
			hr = CallFunctionFast(*IcDeCmpr, hCI, #ICDECOMPRESS_HURRYUP, @bmiOrig\bmiHeader, *lpVHdr\lpData, @bmiDest\bmiHeader, *dibSav)
		EndIf
	Else
		; DIB Sektion sichern
		CopyMemory(*lpVHdr\lpData, *dibSav, *lpVHdr\dwBufferLength )
	EndIf
EndProcedure
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von Frabbing »

Hallo dige,

ist API noch Neuland für dich?

Code: Alles auswählen

1.) SendMessage_ (hwnd, #ICM_DECOMPRESS_BEGIN, @bmiOrig\bmiHeader, @bmiDest\bmiHeader)
2.) hr = CallFunctionFast(*IcDeCmpr, hCI, #ICDECOMPRESS_HURRYUP, @bmiOrig\bmiHeader,...
Ist beides nicht richtig. Viele Vfw-Aufrufe sind weder Funktionen, noch echte Messages. Sie werden über eine eigene SendMessage-Funktionen initiert, in dem Fall mit der Funktion ICSendMessage:

Code: Alles auswählen

sm.i = GetFunction(#msvfw, "ICSendMessage")
If CallFunctionFast(sm, hci, #ICM_DECOMPRESS_BEGIN, @bmi, @bmidest) <> 0
  ...
Das gleiche gilt auch für #ICM_DECOMPRESS und #ICM_DECOMPRESS_END. Hoffe, das hilft dir jetzt weiter. Ich könnte dir meinen Callback-Code posten, aber da sind noch jede Menge andere API eingebaut, die eher verwirren.
Gruß, Frank
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von dige »

Danke für den Tipp mit ICSendMessage, dass hatte ich nicht erkannt.
Leider gehts trotzdem nicht. Es crasht weiterhin beim dekodieren...

Code: Alles auswählen

Structure VIDEOHDR
  lpData.l          ; address of video buffer
  dwBufferLength.l  ; size, in bytes, of the Data buffer
  dwBytesUsed.l     ; Bytes used
  dwTimeCaptured.l  ; time in ms since start
  dwUser.l
  dwFlags.l
  dwReserved.l[4]
EndStructure

#ICERR_OK              = 0
#ICDECOMPRESS_HURRYUP  = 0
#ICM_DECOMPRESS_BEGIN  = $400C
#ICM_DECOMPRESS        = $400D
#ICM_DECOMPRESS_END    = $400E

Macro MAKEFOURCC(ch0, ch1, ch2, ch3)
  (ch0 | (ch1 << 8)) | (ch2 << 16) | (ch3 << 24)
EndMacro

VfWLib = OpenLibrary(#PB_Any,"msvfw32.dll")
If VfWLib
  Global *IcOpen   = GetFunction(VfWLib, "ICOpen")
  Global *IcSndMsg = GetFunction(VfWLib, "ICSendMessage" )
EndIf

Procedure   CameraFrameCallback(hwnd.l, *lpVHdr.VIDEOHDR)
  Protected bmiOrig.BITMAPINFO, bmiDest.BITMAPINFO
  
  SendMessage_ (hwnd, #WM_CAP_GET_VIDEOFORMAT, SizeOf(BITMAPINFO), @bmiOrig)
  
  If bmiOrig\bmiHeader\biCompression
    
    hCI = CallFunctionFast(*IcOpen, MAKEFOURCC('V','I','D','C'), bmiOrig\bmiHeader\biCompression, #ICMODE_DECOMPRESS)
    If hCI
      bmiDest\bmiHeader\biSize = SizeOf(bmiDest\bmiHeader)
      bmiDest\bmiHeader\biWidth = bmiOrig\bmiHeader\biWidth
      bmiDest\bmiHeader\biHeight = bmiOrig\bmiHeader\biHeight
      bmiDest\bmiHeader\biCompression = 0
      bmiDest\bmiHeader\biBitCount = 24
      bmiDest\bmiHeader\biPlanes = 1
      bmiDest\bmiHeader\biSizeImage = bmiOrig\bmiHeader\biWidth * bmiOrig\bmiHeader\biHeight * 3
      
      If CallFunctionFast(*IcSndMsg, hCI, #ICM_DECOMPRESS_BEGIN, @bmiOrig, @bmiDest) = #ICERR_OK
        CallFunctionFast (*IcSndMsg, hCI, #ICM_DECOMPRESS, #ICDECOMPRESS_HURRYUP, @bmiOrig\bmiHeader, *lpVHdr\lpData, @bmiDest\bmiHeader, *dibSav) ; <--- IMA
        CallFunctionFast (*IcSndMsg, hCI, #ICM_DECOMPRESS_END)
      EndIf
      
    EndIf
  Else
    ; DIB Sektion sichern
    CopyMemory(*lpVHdr\lpData, *dibSav, *lpVHdr\dwBufferLength )
  EndIf
EndProcedure
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Frabbing
Beiträge: 160
Registriert: 15.02.2007 21:31
Kontaktdaten:

Re: Surprise - Raumüberwachung, Einbruchschutz, Webcam

Beitrag von Frabbing »

Hi dige,

ist leider kein testfähiger Code. Was fehlt ist schonmal #ICMODE_DECOMPRESS = 2. Aber hast du sicher drin in deinem Code.
Dann ganz wichtig, #ICM_DECOMPRESS und #ICM_DECOMPRESS_END haben beide nur zwei Parameter, denk dran, ist quasi eine Sendmessage-Funktion... deswegen auch der Crash wegen verkehrten Parameter-Pushes:

Code: Alles auswählen

CallFunctionFast(*IcSndMsg, hCI, #ICM_DECOMPRESS, @icd, SizeOf(icd))
CallFunctionFast(*IcSndMsg, hCI, #ICM_DECOMPRESS_END, 0, 0)
Als Parameter zu #ICM_DECOMPRESS wird definitiv eine Struktur verlangt: icd:

Code: Alles auswählen

Structure ICDECOMPRESS
  dwFlags.l
  lpbiInput.i
  lpInput.i
  lpbiOutput.i
  lpOutput.i
  ckid.l
EndStructure
Struktur vorher eintragen:

Code: Alles auswählen

icd\lpbiInput = @bmi
icd\lpInput = *lHdr\lpData
icd\lpbiOutput =@bmidest
icd\lpOutput = *dibSav
Dann sollte es klappen. :)

__________________________________________________
Code-Tags hinzugefügt
15.12.2011
RSBasic
Gruß, Frank
Antworten