Webcam Bilder per Tcp senden

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

mactep

Betreff: Webcam Bilder per Tcp senden

BeitragMi, Jun 23, 2010 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich hab hier ein Code (Von Panno) um mit Blitz3D eine Webcam anzusprechen.
Meine frage nun : Ist es ein gr. Aufwand die Übertragung der Webcam per Tcpserver zu senden ?
oder gibts evtl. schon n guten Code dafür ?

Freune mich auf Antworten


Code: [AUSKLAPPEN]
Graphics3D   800,600,32,3
Global timer,fpscount,fpstemp,fps,x,y
Global driverimagew
Global driverimageh
Global driverdepth
inbank= CreateBank(200) ; <- a little  more byts as you need ! For the future  (sound /avi...)
outbank= CreateBank (10)

CallDLL("METHYL","INIT")   ; dialog driver

capwindowx   =  1; 1  use
capwindowy   =  1; 1        this
capwindoww   = 1; 1               to
capwindowh   =1 ; 1                     make a small previewwindow at 1,1 with 1*1 pixels (invisible ;) )
previewrate  = 90   ;               play here to get better fps from driver           


PokeInt inbank,0,  capwindowx
PokeInt inbank,4,  capwindowy
PokeInt inbank,8,  capwindoww
PokeInt inbank,12, capwindowh
PokeInt inbank,16, previewrate
PokeInt inbank ,24,FakeBank+4

CallDLL("METHYL","SETDATA",inbank,outbank)   ;
CallDLL ("METHYL","START")
CallDLL("METHYL","SETFORMAT")      ; call videoformat       
CallDLL ("METHYL","SETSOURCE")    ;call videosource
CallDLL  ("METHYL","SETPREVIEWON")
CallDLL ("METHYL","SETPREVIEWOFF")



img=CreateImage(1,1)  ;<- fakeimage To get the driversettings
buffer1 =CreateBank((ImageWidth (img)*ImageHeight (img)*4))

ok = CallDLL ("METHYL","GETCLIP",inbank,buffer1)

driverimagew = PeekInt ( inbank,0)
driverimageh = PeekInt (inbank,4 )
driverdepth   = PeekInt  (inbank,8) 

FreeImage img
FreeBank buffer1

img=CreateImage(driverimagew,driverimageh)

Global buffer =CreateBank((ImageWidth (img)*ImageHeight (img)*4))
Global showbuffer =CreateBank(driverimagew*driverimageh*4)

ok = CallDLL ("METHYL","GETCLIP",inbank,buffer)

timer=MilliSecs()

ok = CallDLL ("METHYL","CONTFRAME")   ;<- start capturing

While Not KeyHit(1)

m= MilliSecs()



SetBuffer ImageBuffer(img)
 LockBuffer ImageBuffer(img)
  pointer =0

ok = CallDLL ("METHYL","STOPPFRAME")   ; <- stopp preview  !
For y = 0 To  ImageHeight (img)-1 
For x = 0 To  ImageWidth  (img)-1
rgb = PeekInt (buffer,pointer)
WritePixelFast(x,y,rgb)
pointer =pointer + 4
Next
Next
mi = MilliSecs()-m

 UnlockBuffer ImageBuffer(img)
ok = CallDLL ("METHYL","CONTFRAME")   ; continue capturing
 SetBuffer BackBuffer()
MaskImage img,255,255,255  ; <-   use your own color
DrawImage img,1,1
Text 10,10, mi   ; the time for readfrombank to image 
fpscount=fpscount+1
If MilliSecs()<timer+1000
Else
   fps=fpscount-fpstemp
   fpstemp=fpscount
   timer=MilliSecs()
EndIf
Text 80,10,"FPS "+fps

 Flip(0)
Cls

If MouseHit(1) Then CallDLL ("METHYL","SETPREVIEWON")   ;   
If MouseHit(2) Then CallDLL ("METHYL","SETPREVIEWOFF") ; use this to get full blitzperformance without capture


 Wend

ok = CallDLL("METHYL","ENDCAP")  ; <- Stop capture  unload dll

End


ToeB

BeitragMi, Jun 23, 2010 9:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Alsowebcam bilder mit TCP zu übertragen dauert zu lange, da haste nix von. Machs mit UDP.

Dort packst du die Bilddaten (Pixel) in Blöcke (z.B. von Pixel 1 - 134, 135 - 200, je nach dem ) und versendest die über UDP. Das ist schneller, und wenn ein block mal nicht ankommt ist es ja nicht schlimm, dann sind dort halt mal Pixelfehler aber die werden im nächsten framedurchlauf wieder korrigiert. Wink


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

BadDeath

BeitragMi, Jun 23, 2010 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wird aber auch so ziemlich langsam sein, da du so die Bilder ja quasi als BMP sendest, also unkomprimiert. Ich würde das Bild ein einer Bank mit einer Lib (gabs/gibts hier irgendwo) klein machen, per UDP verschicken, und beim Client wieder so umwandeln, dass es Blitz zeichnen kann, vllts gehts auch direkt, musste mal probieren.
-~= real coders just code in binary =~-

ToeB

BeitragMi, Jun 23, 2010 17:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, deshalb sag ich ja in Blöcke packen, das ist am schnellsten.
Nicht die bitmap byte für byte senden, das ist in der tat sehr langsam, sondern viele bytes in einen Block packen und in einer nachricht abschicken , so in etwa :
Code: [AUSKLAPPEN]
WriteByte( pixel_color[1] )
...
writebyte (pixel_color[100] )
sendUDPMsg
writebyte( pixel_color[101] )
...
writebyte( pixel_color[200] )
sendUDPMsg


Sollte relativ schnell gehen. Da ich sowas ähnliches grade in meiner SimpleUDP verwende kann ich die sagen das es sehr schnell ist. Und das obwohl bei mir immer auf eine Antwort gewartet wird vom empfänger, dadurch wird es bei mir langsamer, aber bei der methode hier sollte es doppelt so schnell sein wie bei mir.

Was langsam ist, die Pixel des Bildes / der Webcam auszulesen.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Eingeproggt

BeitragMi, Jun 23, 2010 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Mal angenommen, die Webcam hätte 300*240 Pixel.
Das macht 72000 Pixel - je 3 Byte (Alpha lassen wir mal weg) ergibt 216kb.
Diese Datenmenge zu versenden geht (über eine derzeit durchschnittliche oder gar gute) Internetverbindung auf jeden Fall langsamer als ein 320*240 Pixel großes Bild auszulesen.
Naürlich hilft das "Packen" in Nachrichtenblöcke etwas, aber 216kb Rohdaten bleiben dir trotzdem die mindestens gesendet werden müssen (UDP-Header nicht gerechnet).
Komprimieren wird ziemlich unumgänglich sein wenn es auch nur annähernd Echtzeit werden soll.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

ToeB

BeitragMi, Jun 23, 2010 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Da muss ich dir wieder sprechen : In meiner SimpleUDP habe ich eine 500 kb große Datei versendet, die außerdem noch sicher gesendet wurde, habe diese in > 8000 Byte Packete gefasst und es hat ca. 100 ms gedauert.

Bei einem 400*300 bild (120000 Pixel) währen das (wie du gesagt hast) 360000 Bytes. Die in 8000er packete, das währen 45 sende-vorgänge. Angenommen man nimmt Flip 0 ohne Timer, dann muss man von einer Schleifenzeit von ~ 5ms ausgehen (ist ein wenig mehr als ich hab), das währen dann 45*5 = 225ms.

Trotzdem Geb ich dir recht, für echtzeit nicht mehr zu gebrauchen. Man müsste einen Algorhytmus haben, der die Bilddaten komprimiert und somit nicht wie in einer Bitmap width*height*3 Bytes gesendet werden müssen sonder z.B. nur width*height / 3. Gibts bestimmt, villeicht guckt man mal im Englischen Forum.


mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Eingeproggt

BeitragMi, Jun 23, 2010 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Dass du das geschafft hast glaub ich dir nur bedingt... 500kb in 100ms entspricht einer Verbindungsgeschwindigketi von 5MB/s - in der Notation der Internetanbieter: 40Mbit/s Exclamation
Das erreicht man im LAN, aber im Internet nicht - außer du lebst in Japan oder ich weiß ja nicht...
Ich hab hier 3.6Mbit laut Anbieter, 1MBit real... also ich spiel da auf nem anderen level und ich würde sagen man soll eher den wenn nicht noch einen niedrigeren Level annehmen wenn man Daten übers Internet schickt.
Ich habe übrigens auf Wikipedia nachgelesen, den IP- und UDP-Header kann man da eher vernachlässigen (insgesamt 20Byte pro Paket, bei 8kb Paketgröße irrelevant).

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

RoLo

BeitragDo, Apr 21, 2011 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiss das dieses Thema schon einbisschen älter ist, aber ich frag jetzt trotzdem nochmal. (Bitte nicht böse sein)
Ich suche schon seit einigen Tagen hier im Forum nach antworten.
Ich will mit der Webcam ein Bild machen und dieses dann über das Netzwerk senden.

Aber ich habe keine Ahnung wie ich das genau machen soll...


Hat jemand grad einen Beispiel-Code zur Hand?

Und wo gibt es die DLLs? Ich habe die DLL "pbca3d2.dll" schon irgendwo im Internet gefunden, aber ich kann damit nichts anfangen.

Die DLL "METHYL.dll"(oder wie die heisst), da kommt am Anfang aber immer so eine Meldung. Das will ich nicht. Ich will, dass es die Webcam automatisch auswählt.

Ich weiss auch zu dieser Frage gibt es ein Thema. Aber es gibt im Forum x-tausend-Beiträge zu dem Thema Webcam. Und ich habe jetzt (fast) alles durchgeschaut und immer nur so halbe Antworten gefunden, darum wäre ich froh wenn ich eine gute Antwort bekomme. Smile

user posted image
Das habe ich schon alles ausprobiert(also ich bin nicht so ein fauler Sack wo wegen jedem kleinen Problem einen Beitrag verfasst)... Very Happy

Vielen Dank im voraus...

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group