Deutsch
Stammtisch & Café

Bewegungsmelder programmieren mithilfe einer Webcam.

 
- Seite 1 -



Frank
Abbing
Funktioniert das bei allen Webcam-Besitzern?

355 kB
Hochgeladen:18.12.2007
Ladeanzahl184
Herunterladen
 
18.12.2007  
 



 
- Seite 1 -



ByteAttack
 
Website:  [...] 
Facebook:  [...] 
19.12.2007  
 




GDL
Bei mir gehs halt leider net.

Servus
Georg
 
Windows7 Xprofan 8,9,10 [...]  [...] 
19.12.2007  
 




Jac
de
Lad
Funktioniert, aber man muss, wie bei den anderen, schon unheimlich rumhampeln, damit das Ding was registriert. Meine TV-Karte wird nicht mit aufgelistet.
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
19.12.2007  
 




Frank
Abbing

Die Hand wird gut gepixelt, aber nur wenn ich sie schnell bewege reagiert das Programm darauf.


Ja, richtig. So ist es auch korrekt.


Funktioniert, aber man muss, wie bei den anderen, schon unheimlich rumhampeln, damit das Ding was registriert.


Derzeit ist die Einstellung nicht sonderlich sensibel gewählt. Dann ist es so ganz nach Wunsch. Ihr könnte die verschiedenen Werte ja mal durchprobieren.

Danke an die fleißigen Tester. Hier, wie versprochen, der Quellcode.
KompilierenMarkierenSeparieren
 {$cleq}
 {$res icon G:Iconsglyt_smallCommonICO16x16views_16_h.ico}
Declare capdll&,capwindow&,rect#,wx&,wy&,bereich#,num&,fcopy#
Declare x&,y&,breite&,hoehe&,positionx&,positiony&,text$,listbox&
Dim rect#,20
Dim bereich#,1024
Dim fcopy#,64
DEF capCreateCaptureWindow(8) ! avicap32.dll,capCreateCaptureWindowA
DEF capGetDriverDescription(5) ! avicap32.dll,capGetDriverDescriptionA
Kamera-Konstanten
Def &WM_Capstart 1024
Def &WM_CAP_DRIVER_CONNECT 1034
Def &WM_CAP_DRIVER_DISCONNECT 1035
Def &WM_CAP_DRIVER_GET_NAME 1036
Def &WM_CAP_DRIVER_GET_VERSION 1037
Def &WM_CAP_SET_CALLBACK_FRAME 1029
Def &WM_CAP_FILE_SET_CAPTURE_FILE 1044
Def &WM_CAP_FILE_GET_CAPTURE_FILE 1045
Def &WM_CAP_FILE_SAVEAS 1047
Def &WM_CAP_FILE_SAVEDIB 1049
Def &WM_CAP_SET_AUDIOFORMAT 1059
Def &WM_CAP_GET_AUDIOFORMAT 1060
Def &WM_CAP_DLG_VIDEOFORMAT 1065
Def &WM_CAP_DLG_VIDEOSOURCE 1066
Def &WM_CAP_DLG_VIDEODISPLAY 1067
Def &WM_CAP_GET_VIDEOFORMAT 1068
Def &WM_CAP_SET_VIDEOFORMAT 1069
Def &WM_CAP_DLG_VIDEOCOMPRESSION 1070
Def &WM_CAP_SET_PREVIEW 1074
Def &WM_CAP_SET_OVERLAY 1075
Def &WM_CAP_SET_PREVIEWRATE 1076
Def &WM_CAP_SET_SCALE 1077
Def &WM_CAP_SET_SCROLL 1079
Def &WM_CAP_GRAB_FRAME 1084
Def &WM_CAP_GRAB_FRAME_NOSTOP 1085
Def &WM_CAP_SEQUENCE 1086
Def &WM_CAP_SEQUENCE_NOFILE 1087
Def &WM_CAP_SET_SEQUENCE_SETUP 1088
Def &WM_CAP_GET_SEQUENCE_SETUP 1089
Def &WM_CAP_SET_MCI_DEVICE 1090
Def &WM_CAP_GET_MCI_DEVICE 1091
Def &WM_CAP_STOP 1092
Def &WM_CAP_ABORT 1093
AsmInclude
.data
nurso               dd  0
lastcount           dd  0
phdc                dd  0
pwnd                dd  0
lwnd                dd  0
starten             dd  0
text1               dd  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
text2               db   Bewegung registriert in Stärke ,0
text3               dd  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
text4               db  Messung wurde gestartet. Bewegungen ab einer Stärke von 250 werden gemeldet. Wert einstellbar,0
text5               db  .,0
text6               db  :,0
text7               db   Uhr.,0
text8               db  0,0
.code
Framebuffer-Callback-Routine
Wird durchlaufen, wann immer Videofenster aktualisiert werden muß.
FrameProc PROC hWnd:DWORD, lpVHdr:DWORD
LOCAL hdc:HDC
LOCAL bmpinfo:BITMAPINFO
LOCAL hBitmap:HBITMAP
LOCAL memory:DWORD
LOCAL bytes:DWORD
LOCAL rc:RECT
LOCAL breite:DWORD
LOCAL hoehe:DWORD
LOCAL xx:DWORD
LOCAL yy:DWORD
LOCAL stime:SYSTEMTIME

.if hWnd == 0

    xor eax, eax
    ret

.endif

pushall
invoke SendMessage,hWnd,1068,44,addr bmpinfo    ;WM_CAP_GET_VIDEOFORMAT
lea edx,bmpinfo
mov eax,[edx+4]
mov breite,eax
mov edx,[edx+8]
mov hoehe,edx
mul edx
mov edx,3
mul edx
mov bytes,eax
invoke SendMessage,hWnd,1054,0,0                ;WM_CAP_EDIT_COPY
invoke CreateCompatibleDC,phdc
mov hdc,eax

.if eax

    invoke OpenClipboard,pwnd
    invoke GetClipboardData,CF_BITMAP
    mov hBitmap,eax
    mov eax,bytes
    invoke GlobalAlloc,GMEM_FIXED+GMEM_ZEROINIT,eax
    mov memory,eax

    .if eax

        lea  edx,bmpinfo
        mov  eax,40
        mov  [edx],eax     ;Size
        mov  eax,breite
        mov  [edx+4],eax   ;Width
        xor  eax,eax
        sub  eax,hoehe
        mov  [edx+8],eax   ;-Height
        mov  ax,1
        mov  [edx+12],ax   ;Planes
        mov  ax,24
        mov  [edx+14],ax   ;BitCount
        invoke GetDIBits,hdc,hBitmap,0,hoehe,memory,addr bmpinfo,DIB_RGB_COLORS
        xor esi,esi        ;counter
        mov xx,79
        mov yy,59
        mov edx,memory
        mov edi,edx
        schleife1:
        xor eax,eax
        xor ebx,ebx
        mov bl,[edx]
        add eax,ebx
        mov bl,[edx+1]
        add eax,ebx
        mov bl,[edx+2]
        add eax,ebx
        mov bl,[edx+3]
        add eax,ebx
        mov bl,[edx+4]
        add eax,ebx
        mov bl,[edx+5]
        add eax,ebx
        mov bl,[edx+6]
        add eax,ebx
        mov bl,[edx+7]
        add eax,ebx
        mov bl,[edx+8]
        add eax,ebx
        mov bl,[edx+9]
        add eax,ebx
        mov bl,[edx+10]
        add eax,ebx
        mov bl,[edx+11]
        add eax,ebx
        mov bl,[edx+960]
        add eax,ebx
        mov bl,[edx+960+1]
        add eax,ebx
        mov bl,[edx+960+2]
        add eax,ebx
        mov bl,[edx+960+3]
        add eax,ebx
        mov bl,[edx+960+4]
        add eax,ebx
        mov bl,[edx+960+5]
        add eax,ebx
        mov bl,[edx+960+6]
        add eax,ebx
        mov bl,[edx+960+7]
        add eax,ebx
        mov bl,[edx+960+8]
        add eax,ebx
        mov bl,[edx+960+9]
        add eax,ebx
        mov bl,[edx+960+10]
        add eax,ebx
        mov bl,[edx+960+11]
        add eax,ebx
        mov bl,[edx+1920]
        add eax,ebx
        mov bl,[edx+1920+1]
        add eax,ebx
        mov bl,[edx+1920+2]
        add eax,ebx
        mov bl,[edx+1920+3]
        add eax,ebx
        mov bl,[edx+1920+4]
        add eax,ebx
        mov bl,[edx+1920+5]
        add eax,ebx
        mov bl,[edx+1920+6]
        add eax,ebx
        mov bl,[edx+1920+7]
        add eax,ebx
        mov bl,[edx+1920+8]
        add eax,ebx
        mov bl,[edx+1920+9]
        add eax,ebx
        mov bl,[edx+1920+10]
        add eax,ebx
        mov bl,[edx+1920+11]
        add eax,ebx
        mov bl,[edx+2880]
        add eax,ebx
        mov bl,[edx+2880+1]
        add eax,ebx
        mov bl,[edx+2880+2]
        add eax,ebx
        mov bl,[edx+2880+3]
        add eax,ebx
        mov bl,[edx+2880+4]
        add eax,ebx
        mov bl,[edx+2880+5]
        add eax,ebx
        mov bl,[edx+2880+6]
        add eax,ebx
        mov bl,[edx+2880+7]
        add eax,ebx
        mov bl,[edx+2880+8]
        add eax,ebx
        mov bl,[edx+2880+9]
        add eax,ebx
        mov bl,[edx+2880+10]
        add eax,ebx
        mov bl,[edx+2880+11]
        add eax,ebx
        push edx
        xor edx,edx
        mov ebx,48
        div ebx
        pop edx

        .if al>=96

            mov al,255
            inc esi

        .else

            mov al,0

        .endif

        mov [edx],al
        mov [edx+1],al
        mov [edx+2],al
        mov [edx+3],al
        mov [edx+4],al
        mov [edx+5],al
        mov [edx+6],al
        mov [edx+7],al
        mov [edx+8],al
        mov [edx+9],al
        mov [edx+10],al
        mov [edx+11],al
        mov [edx+960],al
        mov [edx+960+1],al
        mov [edx+960+2],al
        mov [edx+960+3],al
        mov [edx+960+4],al
        mov [edx+960+5],al
        mov [edx+960+6],al
        mov [edx+960+7],al
        mov [edx+960+8],al
        mov [edx+960+9],al
        mov [edx+960+10],al
        mov [edx+960+11],al
        mov [edx+1920],al
        mov [edx+1920+1],al
        mov [edx+1920+2],al
        mov [edx+1920+3],al
        mov [edx+1920+4],al
        mov [edx+1920+5],al
        mov [edx+1920+6],al
        mov [edx+1920+7],al
        mov [edx+1920+8],al
        mov [edx+1920+9],al
        mov [edx+1920+10],al
        mov [edx+1920+11],al
        mov [edx+2880],al
        mov [edx+2880+1],al
        mov [edx+2880+2],al
        mov [edx+2880+3],al
        mov [edx+2880+4],al
        mov [edx+2880+5],al
        mov [edx+2880+6],al
        mov [edx+2880+7],al
        mov [edx+2880+8],al
        mov [edx+2880+9],al
        mov [edx+2880+10],al
        mov [edx+2880+11],al
        add edx,12
        dec xx
        cmp xx,0
        jge schleife1
        mov edx,edi
        add edx,3840
        mov edi,edx
        mov xx,79
        dec yy
        cmp yy,0
        jge schleife1
        mov eax,lastcount
        sub eax,esi
        m2m lastcount,esi

        .if SIGN?

            neg eax

        .endif

        .if starten>3

            .if eax>=250      ;Bewegungsmelder Grenzwert (250) erreicht

                mov text3,0
                push eax
                invoke GetLocalTime,addr stime
                xor eax,eax
                mov ax,stime.wHour
                invoke dwtoa,eax,addr text1
                invoke lstrlen,addr text1

                .if eax==1

                    invoke lstrcat,addr text3,addr text8

                .endif

                invoke lstrcat,addr text3,addr text1
                invoke lstrcat,addr text3,addr text6
                xor eax,eax
                mov ax,stime.wMinute
                invoke dwtoa,eax,addr text1
                invoke lstrlen,addr text1

                .if eax==1

                    invoke lstrcat,addr text3,addr text8

                .endif

                invoke lstrcat,addr text3,addr text1
                invoke lstrcat,addr text3,addr text6
                xor eax,eax
                mov ax,stime.wSecond
                invoke dwtoa,eax,addr text1
                invoke lstrlen,addr text1

                .if eax==1

                    invoke lstrcat,addr text3,addr text8

                .endif

                invoke lstrcat,addr text3,addr text1
                invoke lstrcat,addr text3,addr text7
                pop eax
                invoke dwtoa,eax,addr text1
                invoke lstrcat,addr text3,addr text2
                invoke lstrcat,addr text3,addr text1
                invoke lstrcat,addr text3,addr text5
                invoke SendMessage,lwnd,LB_ADDSTRING,0,addr text3
                invoke SendMessage,lwnd,LB_GETCOUNT,0,0
                dec eax
                invoke SendMessage,lwnd,LB_SETTOPINDEX,eax,0
                invoke Beep,3000,25

            .endif

        .elseif starten==3

            invoke SendMessage,lwnd,LB_ADDSTRING,0,addr text4

        .endif

        inc starten
        invoke SetDIBitsToDevice,phdc,328,0,breite,hoehe,0,0,0,hoehe,memory,addr bmpinfo,DIB_RGB_COLORS
        invoke GlobalFree,memory

    .endif

    invoke CloseClipboard
    invoke DeleteDC,hdc

.endif

popall
mov eax, 1
ret
FrameProc ENDP

AsmEnd

Proc GetCaptureDriverList

Declare Treiber$,Version$,Zaehler%
ClearList

WhileNot zaehler%=9   reicht fuer 9 Treiber, mehr erlaubt das System nicht.

    Treiber$=Space$(80)
    Version$=Space$(80)

    If capGetDriverDescription(Zaehler%,ADDR(Treiber$),80,ADDR(Version$),80) > 0

        AddString Trim$(Treiber$)

    Endif

    Inc Zaehler%

EndWhile

EndProc

capdll&=UseDll(avicap32.dll)
Windowtitle Bitte Kamera-Treiber wählen.
Windowstyle 512 | 26
Window %maxx,0-320,240
Cls GetSysColor(15)
Usefont MS Sans Serif,10,0,0,0,0
SetDialogFont 1
listbox&=Create(ListBox, %hwnd,0, 8, 8, 320, 160)
GetCaptureDriverList
MoveListToList(listbox&)
x&=GetCount(listbox&)

If x&

GetClientRect(%hwnd,rect#)
wx&=320-Long(rect#,8)-Long(rect#,0)
wy&=240-Long(rect#,12)-Long(rect#,4)
SetWindowPos %hwnd=(%maxx/2-160),(%maxy/2-80)-(320+16+wx&),(160+16+wy&)

While 1

    WaitInput

    If %key=3

        Break

    EndIf

Endwhile

num&=GetCurSel(listbox&)
case num&<0:num&=0
DestroyWindow(listbox&)
SetWindowPos %hwnd=%maxx,0-320,240
Windowtitle Cap Thief, Webcam-Bewegungsmelder © 2007 http://frabbing.de
Control(STATIC, Originaler Datenstream, $54000301, 0, 240, 320, 20, %hwnd, 2001, %hInstance, $00000000)
Control(STATIC, Echtzeit-manipulierte Daten, $54000301, 328, 240, 320, 20, %hwnd, 2002, %hInstance, $00000000)
listbox&=Create(ListBox, %hwnd, 0, 8, 260, 632, 192)
Kamerafenster erstellen
capwindow&=capCreateCaptureWindow(0,WS_CHILD | WS_VISIBLE,0,0,320,240,%Hwnd,0)

If SendMessage(capwindow&,&WM_CAP_DRIVER_CONNECT,num&,0)

    Videoformat zur Wiederherstellung sichern
    Clear fcopy#
    SendMessage(capwindow&,&WM_CAP_GET_VIDEOFORMAT,44,fcopy#)
    Neues Videoformat setzen
    Clear bereich#
    Long bereich#,0=40
    Long bereich#,4=320
    Long bereich#,8=240
    Word bereich#,12=1
    Word bereich#,14=24
    Long bereich#,20=320*240*3
    SendMessage(capwindow&,&WM_CAP_SET_VIDEOFORMAT,44,bereich#)
    Kamera ausrichten und einschalten
    SendMessage(capwindow&,&WM_CAP_SET_PREVIEWRATE,1,0)
    Sendmessage(capwindow&,&WM_CAP_SET_SCALE,1,0)
    SendMessage(capwindow&,&WM_CAP_SET_PREVIEW,1,0)
    Sendmessage(capwindow&,&WM_CAP_SET_OVERLAY,0,0)

    AsmStart SCall1(capwindow&,%hdc,%hwnd,listbox&)

        m2m phdc,para2
        m2m pwnd,para3
        m2m lwnd,para4
        invoke SendMessage,para1,1029,0,addr FrameProc    ;WM_CAP_SET_CALLBACK_FRAME

    AsmEnd

    GetClientRect(%hwnd,rect#)
    wx&=320-Long(rect#,8)-Long(rect#,0)
    wy&=240-Long(rect#,12)-Long(rect#,4)
    SetWindowPos %hwnd=(%maxx/2-320),(%maxy/2-220)-(320+320+8+wx&),(440+20+wy&)

    While 1

        WaitInput
        Case %key=2:Break

    Endwhile

    Videoformat wiederherstellen
    SendMessage(capwindow&,&WM_CAP_SET_VIDEOFORMAT,44,fcopy#)
    SendMessage(capwindow&,&WM_CAP_SET_PREVIEW,0,0)
    SendMessage(capwindow&,&WM_CAP_DRIVER_DISCONNECT,0,0)

Else

    MessageBox(Eine Verbindung zur Kamera ist
    derzeit nicht möglich.,Information:,64)

EndIf

DestroyWindow(capwindow&)
DestroyWindow(%hwnd)

Else

MessageBox(Im System wurde keine
Kamera gefunden.,Information:,64)

EndIf

FreeDll capdll&
Dispose rect#
Dispose bereich#
Dispose fcopy#
End

XPIA wird noch diese Macros für die basis.inc benötigen:
KompilierenMarkierenSeparieren
 
19.12.2007  
 




Christian
Eichler
Frank, sorry für die späte Antwort. Bei mir funktionniert es auch nicht, das linke Fenster bleibt einfach schwarz.
Die Kamera funktonniert, im Explorer wird ein Bild angezeigt !

mfg Christian E
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
19.12.2007  
 




Frank
Abbing
Danke Christian!
Du hast jetzt ja den Quellcode und könntest selber auf die Suche nach der Ursache gehen. Dass nur ein Programm gleichzeitig auf die Cam zugreifen kann, weißt du ja?
 
19.12.2007  
 



 
- Seite 2 -


...was ich tatsächlich als peinliche Windowseigenschaft empfinde...
 
19.12.2007  
 




Christian
Eichler
Frank Abbing
Dass nur ein Programm gleichzeitig auf die Cam zugreifen kann, weißt du ja?


Ja, das ist mir bewusst ... ich hab schon aufgepasst, dass nur ein Programm die Cam verwendet
 
Debian Lenny, Intel Celeron 2,8 Ghz, 768 MB Ram && Win XP Pro, Intel C2D 1,66Ghz, 2 GB Ram ... PROFAN² 6.6
19.12.2007  
 




Rolf
Koch
Bei mir unter Vista läuft es wie geschmiert. Jedoch aber nur wenn genug Licht im Spiel ist. Wenn es zu Dunkel ist, dann reagiert das Tool nicht auf Bewegung. Normal?
 
19.12.2007  
 




Frank
Abbing

Wenn es zu Dunkel ist, dann reagiert das Tool nicht auf Bewegung. Normal?


Meine Webcam hat 6 kleine Leuchten...
Nein, Rolf. Die Lichtempfindlichkeit stellst du an dieser Stelle des Codes ein:
KompilierenMarkierenSeparieren
.if al>=96        ;<----- hier

    mov al,255
    inc esi

.else

    mov al,0

.endif


Versuch mal andere Werte (0-255) anstelle von 96.
 
19.12.2007  
 




Jac
de
Lad
Meine hat 4, aber die sind schweinehell...
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
19.12.2007  
 




Michael
Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
20.12.2007  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

4.547 Betrachtungen

Unbenanntvor 0 min.
Georg Teles12.05.2023
Walter30.04.2023
Thomas Zielinski16.02.2022
Rolf Koch15.02.2013
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie