|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 23.09.2006, 14:23 Titel: bmp, avi mit der Webcam und FB |
|
|
Hi,
in Purebasic gibt es die Möglichkeit den Videostream in einem eigenen Window darzustellen.
Das musste auch in FB gehen, aber da hakte immer die vfw.bi.
Ohne MichaelW aus dem engl. Forum hätte ich den Fehler in der vfw.bi so schnell nicht gefunden,
zu #inclib "avicap32" gibt es keine libavicap32.dll.a Datei in FB0.16 (auch noch nicht in FB0.17)?
Nachdem die selbst erstellt war ging es dann
Code: | #include once "win\vfw.bi" 'Die vfw.bi includet schon die windows.bi
'libavicap32.dll.a nach FBverzeichnis/lib/win32 schieben.
Option Explicit
Function WindowProc (Byval hWnd As HWND,_
Byval uMsg As uint,_
Byval wParam As WPARAM,_
Byval lParam As LPARAM) As LRESULT
Dim hDC As HDC
Dim ps As PAINTSTRUCT
Static hWndCam As HWND
Select Case uMsg
Case WM_CREATE
hWndCam = capCreateCaptureWindow ("CapCam", WS_CHILD Or WS_VISIBLE, _
15, 40, 320, 240, hWnd, 500)
If hWndCam = 0 Then
MessageBox (hWnd, "keine Webcam gefunden ..", "Fehler", MB_ICONERROR)
DestroyWindow (hWnd)
Return 0
End If
capDriverConnect (hWndCam, 0) 'nur für eine WebCam sonst, iIndex=1,2,3 ...
'capPreviewScale(hWndCam, 1) 'Anpassen Bildformat an CaptureWindow
capPreviewRate (hWndCam, 30)
''capOverlay (hWndCam, 1) 'enable overlay mode or 0 to disable
capPreview (hWndCam, 1) 'Vorschau (de)aktivieren
'capGrabFrame (hWndCam) 'Einzelbild anzeigen
capGrabFrameNoStop (hWndCam) 'Videostream zeigen
capFileSaveDIB(hWndCam, @"CapCam1.bmp") 'Schnappschuss als CapCam1.bmp
'erstellt C:/CAPTURE.AVI bis ESC oder Mousetaste betätigt wird
'capCaptureSequence (hWndCam)
Return 0
Case WM_COMMAND
Return 0
Case WM_PAINT
hDC = BeginPaint (hWnd, @ps)
EndPaint (hWnd, @ps)
Return 0
Case WM_CLOSE
'Beim Beenden muss die WebCam wieder freigegeben werden!
capDriverDisconnect (hWndCam)
DestroyWindow (hWnd)
Case WM_DESTROY
PostQuitMessage (NULL)
Return 0
Case Else
Return DefWindowProc (hWnd, uMsg, wParam, lParam)
End Select
End Function
...
... | Den Rest (die Winmain) und die fehlende libavicap32.dll.a hab ich als zip (7KB) hier eingestellt.
Alles nur unter WinME und FB0.16stabel getestet, mit einer älteren Kamera im Webcam-Modus (320x240) über USB.
Gruß Volt _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
pebisoft gesperrt
Anmeldungsdatum: 28.11.2004 Beiträge: 131
|
Verfasst am: 23.09.2006, 16:57 Titel: |
|
|
herzlichen glückwunsch, alle achtung!!!!
es läuft wunderbar.
jetzt habe ich auch einen anhalt, wie die ganzen variablen verarbeitet werden.
in der vfw.bi stehen ja die defines usw drin, wozu braucht man trotzdem eine libavicap32dll.a ?
was steht eigentlich in der dll.a drin und wie wird die eigentlich erstellt? interessiert mich sehr.
welcher fehler war eigentlich in der vfw.bi???
ich nehme zur probe :
Code: |
SendMessage (hWndCam, WM_CAP_DRIVER_CONNECT, 0 , 0)
SendMessage (hWndCam, WM_CAP_SET_PREVIEWRATE, 30 , 0)
SendMessage (hWndCam, WM_CAP_PREVIEW, 0 , 0)
SendMessage (hWndCam, WM_CAP_GRAB_FRAME_NOSTOP, 0 , 0)
SendMessage (hWndCam, WM_CAP_EDIT_COPY, 0 , 0)
|
läuft auch damit .
warum wird die lib.dll.a immer noch gebraucht? |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 23.09.2006, 20:35 Titel: |
|
|
pebisoft hat Folgendes geschrieben: | welcher fehler war eigentlich in der vfw.bi???
was steht eigentlich in der dll.a drin und wie wird die eigentlich erstellt? interessiert mich sehr.
warum wird die lib.dll.a immer noch gebraucht? |
in der vfw.bi steht #inclib "avicap32" damit versucht FB die Funktionen der avicap32.dll aufzurufen.
Damit das direkt erfolgen kann wurden mit dem dlltool diese libavicap32.dll.a Datei erstellt.
Da ist dann schon drin an welcher Adresse in der dll diese Funktion liegt, in welcher Reihenfolge welche Ein- Ausgabeparameter diese Funktion benötigt.
Das muss dann nicht zur Laufzeit ermittelt werden.
Da die libavicap32.dll.a fehlte, womit ich nun garnicht gerechnet hatte, hakte es immer.
capDriverConnect (hWndCam, 0) <=> SendMessage (hWndCam, WM_CAP_DRIVER_CONNECT, 0 , 0)
ist identisch, in der vfw.bi ist dies nach C-Manier definiert. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Wurm
Anmeldungsdatum: 30.10.2005 Beiträge: 16
|
Verfasst am: 21.10.2006, 18:43 Titel: Einbinden in bestehendes Programm |
|
|
Hallo Volta,
ich bin nicht so der Programmierer und hoffe du kannst mir helfen.
Dein Programm mit der Webcam camtest3 gefällt mir gut und läuft auch auf meinem Rechner. Jetzt habe ich es in mein bestehendes Programm eingebunden, doch beim starten stürzt nun immer die FBI ab.
Wie muß ich das Programm aufteilen?
Definitionen oben
Programmteil an die entsprechende Stelle
Und Unterprogramm an das Ende
Aber wo fängt was an und auf was muß man noch achten.
Ciao
Frank |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 22.10.2006, 16:37 Titel: |
|
|
Hi Frank,
ich bin mir nicht sicher in welcher Art Programm du das cam_test3 eingebunden hast.
Wenn du versuchst es einfach in ein fbgfx-Window (mit screen oder screenres erstellt) einzubinden kann es Probleme machen.
Das Programm erzeugt ein Window mit WinAPI-Funktionen, welche die Darstellung des Videostreams sehr vereinfachen.
In einem fbgfx-Window muss jedes Bild auf das Darstellungsformat des FB-Screens angepasst werden. Im engl. Forum ist hier http://www.freebasic.net/forum/viewtopic.php?p=52031#52031 ein solches Programm angegeben.
Wenn ich dich hier falsch verstanden habe, und du willst es auch mit WinAPI-Funktionen versuchen, schau dir mal das Tut von Lutz_Ifer an http://lutzifer.freebasic.de/winapi/ . _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
robbyfant gesperrt
Anmeldungsdatum: 22.10.2006 Beiträge: 52
|
Verfasst am: 22.10.2006, 18:11 Titel: |
|
|
also dieses programm mit fbgfx läuft nicht bei mir. programm läuft sich tot.
man kann den bildschirm wählen und die farbe , dann läuft nichts mehr.
ich benutze xp und win me.
das erste programm mit dem windows-screen läuft wie die lucy auf beiden systemen.
mfg |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 23.10.2006, 11:49 Titel: |
|
|
Hi pebisoft ähh robbyfant,
da einige user im engl. Forum das Prog laufen lassen muss der Fehler nicht im Programm liegen.
Bei deiner Bemerkung zur Bildschirm- und Farbwahl vermute ich, du musst vorab in den Treiberoptionen zu deiner Camera das Farbformat umstellen
"please select an i420 YUV or RGB24 format!".
Über die WinAPI-Funktionen werden einige andere Formate erkannt und im Window angezeigt,
bei fbgfx müsste man für jedes Format eine eigene Umwandlungfunktion auf RGB32 schreiben. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
Wurm
Anmeldungsdatum: 30.10.2005 Beiträge: 16
|
Verfasst am: 23.10.2006, 18:50 Titel: |
|
|
Hi,
ich wollte die webcam in ein bestehendes Programm integrieren welches den ganzen Bildschirm benötigt. In der Mitte sollte dann das Kamerabild erscheinen. Letztlich wäre es mir egal ob es über die WinApi oder die fbgfx läuft, wenn es nur funktioniert.
Hier ein kleines Programm-Beispiel:
[code]
SCREEN 20,24,2,1 : WIDTH 128,96 :
line (1,1)-(1021,766),1000,b
100 LOCATE 10,20 : ? TIME$
frage$ = INKEY$
IF frage$ = " " THEN end
goto 100
[/code]
Vielleicht kann mir jemand helfen wie ich das Programm einbinden muß das es funktioniert.
Ciao
Frank |
|
Nach oben |
|
|
robbyfant gesperrt
Anmeldungsdatum: 22.10.2006 Beiträge: 52
|
Verfasst am: 23.10.2006, 19:39 Titel: |
|
|
http://volta.de.tt/cam_test.zip
diese programm benutze ich.
ich habe einmal ein kleines windows-originalvideobild mit capture und das andere videobild geht in die ablage und von da aus hole ich es raus auf einem normalen freebasicscreen zum pixelauswerten für hindernisse für die roboterfahrt, es geht auch so schnell, das es auch als video läuft.
super sache.
mfg
Zuletzt bearbeitet von robbyfant am 23.10.2006, 19:43, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
robbyfant gesperrt
Anmeldungsdatum: 22.10.2006 Beiträge: 52
|
Verfasst am: 23.10.2006, 19:42 Titel: |
|
|
hallo volta, das programm aus dem englisch-forum bringe ich nicht zum laufen.
ich bleibe bei deinem captureprogramm. ist ein einfaches händling und man kan auch noch ein bild auf den freebasicscreen zaubern ohne umstände für andere auswertungen.
mfg |
|
Nach oben |
|
|
robbyfant gesperrt
Anmeldungsdatum: 22.10.2006 Beiträge: 52
|
Verfasst am: 23.10.2006, 19:45 Titel: |
|
|
hallo volta, kennst du etwas von opengl und milkshapedaten einlesen. habe im vorigen thread (allgemeine forum)einpaar fragen.
mfg |
|
Nach oben |
|
|
Wurm
Anmeldungsdatum: 30.10.2005 Beiträge: 16
|
Verfasst am: 23.10.2006, 19:55 Titel: |
|
|
ja genau die Programme aus deiner cam_test.zip habe ich ausprobiert, komme aber nicht klar damit. So gut kann ich nicht leider nicht programmieren. Wenn ich deine Programme starte funktionieren sie, aber ich bekomme sie nicht in mein kleines Testprogramm hinein. Wenn du oder robbyfant vielleicht die Muse besitzt meine drei Zeilen mit dem Kameraprogramm zum Laufen zu kriegen wäre das echt eine riesen Hilfe für mich. |
|
Nach oben |
|
|
robbyfant gesperrt
Anmeldungsdatum: 22.10.2006 Beiträge: 52
|
Verfasst am: 23.10.2006, 20:23 Titel: |
|
|
du legst die libavicap....a in den unterordner lib/win32 von freebasic, dort liegen auch noch andere "a" dateien.
startest die cam_timer.exe und dann die zeig_clipboard.exe und dann siehst du die bilder in einem normalen freebasicscreen.
weiterhin siehst du das bild im windowsscreen.
du musst aber eine avicap32.dll im systemordner von windows haben.
die dll kannste aus dem internet holen, google nach avicap32.dll.
in der cam_timer.bas kannste den timer noch verändern, er steht auf 1000 also 1 sekunde. ich habe auf 75 gestellt bei mir.
mfg |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 24.10.2006, 14:57 Titel: |
|
|
Hi Frank,
leider komme ich derzeit kaum dazu mich mit FB zu beschäftigen, manchmal gibt es halt wichtigeres.
Der Ansatz von robby ist doch schon hilfreich und wenn du selbst mal experimentierst ist das bestimmt sehr lehrreich.
@robbyfant
Zitat: | kennst du etwas von opengl und milkshapedaten einlesen |
leider nicht, in opengl bin ich auch absoluter Anfänger
EDIT/ ich muss gerade feststellen, dass das Prog aus dem engl. Forum bei mir auf ME auch nicht läuft ??
Das Prog aus dem ersten Beitrag läuft, hängt aber nach einem Mausklick ?? _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 25.10.2006, 22:45 Titel: |
|
|
es hat mir keine Ruhe gelassen...
nach einigen Fehlschlägen mit dem Videostream (der läßt sich immer noch nicht fehlerfrei in einen fbgfx-Window einbauen)
habe ich zum Einzelbildgrabschen (GRAB_FRAME) gegriffen.
Wenn man das schnell genug macht, sieht ja auch ein Daumenkino wie ein Film aus .
Joshys Programm funktionierte bei mir auf ME leider nicht, aber es hat ein paar sehr gute Ansätze für das Bildgrabschen.
Code: | ' mit FB016 erstellt und nur unter ME getestet
'
Option Explicit
Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
Byval As Zstring Ptr, Byval As Zstring Ptr) As Integer
Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
Byval hwnd As Integer, Byval wMsg As Integer, _
Byval wParam As Integer, Byval lParam As Any Ptr) As Integer
Declare Sub CamCap_init
Declare Sub CamCap_off
#define CAP_BASE 1024
Enum CAP_MESSAGES
SET_CALLBACK_FRAME = CAP_BASE + 5
DRIVER_CONNECT = CAP_BASE + 10
DRIVER_DISCONNECT = CAP_BASE + 11
GET_VIDEOFORMAT = CAP_BASE + 44
GET_STATUS = CAP_BASE + 54
GRAB_FRAME = CAP_BASE + 60
End Enum
#define Grab SendMessage(hCapture,GRAB_FRAME,0,0)
Type BITMAPINFOHEADER_t
As Integer biSize
As Integer biWidth
As Integer biHeight
As Short biPlanes
As Short biBitCount
As Integer biCompression
As Integer biSizeImage
As Integer biXPelsPerMeter
As Integer biYPelsPerMeter
As Integer biClrUsed
As Integer biClrImportant
End Type
Type RGB32 Field = 1
As Byte b,g,r,a
End Type
Type VIDEOHDR
As Byte Ptr lpData
As Uinteger BufferSize
As Uinteger BytesUsed
As Uinteger TimeCaptured
As Integer Ptr lpUserData
As Uinteger Flag
As Integer Ptr Reserved(0 To 3)
End Type
Type CreateCaptureWindow_t As Function ( _
Byval title As Zstring Ptr, Byval flag As Integer, _
Byval x As Integer, Byval y As Integer, _
Byval w As Integer, Byval h As Integer, _
Byval hParent As Integer, Byval id As Integer) As Integer
Dim Shared As CreateCaptureWindow_t CreateCaptureWindow
Dim Shared As Integer hDLL,hCapture
Dim Shared As Integer cam_breite,cam_hoehe,CamPosX=10,CamPosY=10
Dim Shared As Integer Ptr cap_image
Function GRAB_FRAME2Image(Byval hWin As Integer, Byval lpHeader As VIDEOHDR Ptr) As Integer
Dim As Integer picsize,zeile,x,y,j
Dim As RGB32 Ptr lpScreen
picsize = lpHeader->BytesUsed\3
If picsize = cam_breite*cam_hoehe Then
zeile = cam_breite*(cam_hoehe-1)
lpScreen = Cptr(RGB32 Ptr,(cap_image))+1
For y = 0 To cam_hoehe-1
For x = 0 To cam_breite-1
lpScreen[zeile+x].b = lpHeader->lpData[j]
lpScreen[zeile+x].g = lpHeader->lpData[j+1]
lpScreen[zeile+x].r = lpHeader->lpData[j+2]
j+ = 3
Next
zeile -= cam_breite
Next
Screenlock
Put (CamPosX,CamPosY),cap_image,Pset
Screenunlock
End If
Return 1
End Function
Sub CamCap_init
Dim As BITMAPINFOHEADER_t biheader
hDll = Dylibload("avicap32")
If hDll<>0 Then
CreateCaptureWindow = Dylibsymbol(hDLL,"capCreateCaptureWindowA")
Else
? "error: can't load avicap32.dll !"
Sleep:End 1
End If
hCapture = CreateCaptureWindow("Voltas_CamCap",&H40000000,0,0,0,0,FindWindow(0,0),0)
If hCapture = 0 Then
? "error: cant create capture window !"
CamCap_off
Sleep:End 1
End If
If SendMessage(hCapture, DRIVER_CONNECT ,0,0)<>1 Then
? "error: cant connect the driver !"
CamCap_off
Sleep:End 1
End If
SendMessage(hCapture, GET_VIDEOFORMAT, Sizeof(BITMAPINFOHEADER_t),@biHeader)
If (biHeader.biCompression<>0) Then
?"error: sorry this example needs RGB !"
CamCap_off
Sleep:End 1
End If
cam_breite = biHeader.biWidth
cam_hoehe = biHeader.biHeight
cap_image = imagecreate(cam_breite,cam_hoehe,32)
SendMessage(hCapture,SET_CALLBACK_FRAME,0, @GRAB_FRAME2Image)
'Grab
End Sub
Sub CamCap_off
SendMessage(hCapture,DRIVER_DISCONNECT ,0,0)
If hDLL<>0 Then DylibFree(hDll)
If cap_image<>0 Then Imagedestroy cap_image
End Sub
' main
Screen 20,32, ,1
CamPosX=350
CamPosY=260
CamCap_init
Line (1,1)-(1021,766),Rgb(0,0,255),B
Do
Locate 10,20 : ? Time
Grab
Sleep 1
Loop Until Inkey$=" "
CamCap_off
End |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
robbyfant gesperrt
Anmeldungsdatum: 22.10.2006 Beiträge: 52
|
Verfasst am: 25.10.2006, 23:32 Titel: |
|
|
he volta, du bist ein genie.
du kannst es nicht lassen, findest keine ruhe, genial.
man kann jetzt schön mit videocapture den freebasic-screen nutzen.
ist wie ein erstklassiges daumenkino, ohne flimmern und dann noch gleichzeitig andere grafikbilder einbinden und bearbeiten.
danke.
mfg |
|
Nach oben |
|
|
Wurm
Anmeldungsdatum: 30.10.2005 Beiträge: 16
|
Verfasst am: 28.10.2006, 22:48 Titel: |
|
|
Bei mir kommt neuerdings immer
error: cant connect the driver !
Auch die anderen Cam-Testprogramme laufen nicht mehr.
Die haben vorher einwandfrei funktioniert
Wo müssen denn die Treiber versteckt sein.
Die Camera läßt sich aber über die mitgelieferte Software noch bedienen.
Eine Idee woran das liegen kann? Hatte mich so auf das Programm gefreut. |
|
Nach oben |
|
|
robbyfant gesperrt
Anmeldungsdatum: 22.10.2006 Beiträge: 52
|
Verfasst am: 28.10.2006, 23:29 Titel: |
|
|
diese in freebasic/lib/win32 : libadvapi32.dll.a
die "avicap32.dll" in das windowsverzeichnis unter system oder system32, kann sein dass die schon drin ist, wenn du deine cam installiert hast.
musste mal ausprobieren.
beide programme funktionieren einwandfrei und fehlerfrei.
wenn du einmal die cam gestartet hast und die cam wird programmäßig nicht richtig getrennt, kannst du die avicap32.dll kein zweites mal starten sondern musst den computer reseten.
" SendMessage(hCapture,DRIVER_DISCONNECT ,0,0)"
diese routine ist dafür verantwortlich. |
|
Nach oben |
|
|
Wurm
Anmeldungsdatum: 30.10.2005 Beiträge: 16
|
Verfasst am: 29.10.2006, 16:31 Titel: |
|
|
Ich muß mich den Worten meines Vorgängers robbyfant anschliessen.
Volta du bist ein Genie. Genau so hatte ich es mir vorgestellt. Ein Livebild in dem Screen.
Auf einem Rechner funktioniert es einwandfrei.
Auf einem anderen funktionieren die sämtlichen Kameratestprogramme nicht mehr. Ich habe keine Idee woran es liegen könnte da die zwei Dateien "libadvapi32.dll.a" und "avicap32.dll" immer noch vorhanden sind.
Aber ich komme noch dahinter, da jetzt wenigstens das wichtigste Problem gelöst ist. |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|