VideoAnalyse; Schaust du weiter
Verfasst: 13.04.2006 09:43
Mein Code:
Noch kann er nicht viel und ist noch sehr unflexibel.
Aber das Grundgerüst für schnellen Zugriff ist gegeben.
Mag jemand vielleicht mit mir zusammen einen Algorithmus entwickeln, der aus der VideoQuelle ... geometrische Formen erkennen kann ...
selbstverständlich mit einer gewissen Tolleranz.
Linienstärke, Winkel, Längen ...
Ziel soll sein: Oh, ich sehe einen roten Kreis
Ah, da ist ein Quadrat mit einem Winkel relativ zur unteren Bildschirmkante von 45° ... (oder auch ein Karo
)
Und das Quadrat besteht selbst aus Linien.
Ich würde mich schon freuen, wenn ich überhaupt eine schwarze Linie auf weißen Untergrund ermitteln kann und vielleicht noch ihre Drehung errechnen kann.
Code: Alles auswählen
{- Information
; Folker Linstedt
;
;}/
;aus "capture.pb" und "inc.pb"
Enumeration
#Link2
#Link3
#Sprite3D
#Sprite3D2
EndEnumeration
Dim Farbe.b(4)
;- Window Constants
Global hWnd
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
Enumeration
#Button_0
EndEnumeration
Procedure Open_Window_0()
hWnd=OpenWindow(#Window_0, 0, 0, 410, 410, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "(c) Folker Linstedt 2006 - Desktop muss: 32 Bit BGR sein")
EndProcedure
#WM_CAP_START = #WM_USER
#WM_CAP_SET_CALLBACK_ERROR = #WM_CAP_START + 2
#WM_CAP_SET_CALLBACK_STATUS = #WM_CAP_START + 3
#WM_CAP_SET_CALLBACK_YIELD = #WM_CAP_START + 4
#WM_CAP_SET_CALLBACK_FRAME = #WM_CAP_START + 5
#WM_CAP_SET_CALLBACK_VIDEOSTREAM = #WM_CAP_START + 6
#WM_CAP_SET_CALLBACK_WAVESTREAM = #WM_CAP_START + 7
#WM_CAP_DRIVER_CONNECT = #WM_CAP_START + 10
#WM_CAP_DRIVER_DISCONNECT = #WM_CAP_START + 11
#WM_CAP_DRIVER_GET_CAPS = #WM_CAP_START + 14
#WM_CAP_DLG_VIDEOFORMAT = #WM_CAP_START + 41
#WM_CAP_DLG_VIDEOSOURCE = #WM_CAP_START + 42
#WM_CAP_DLG_VIDEODISPLAY = #WM_CAP_START + 43
#WM_CAP_SET_PREVIEW = #WM_CAP_START + 50
#WM_CAP_SET_PREVIEWRATE = #WM_CAP_START + 52
#WM_CAP_GET_STATUS = #WM_CAP_START + 54
#WM_CAP_FILE_SAVEDIB = #WM_CAP_START + 25
#WM_CAP_SET_SCALE = #WM_CAP_START + 53
#WM_CAP_SET_CALLBACK_CAPCONTROL = #WM_CAP_START + 85
#WM_CAP_EDIT_COPY = #WM_CAP_START + 30
#WM_CAP_GRAB_FRAME = #WM_CAP_START+60
InitSprite()
InitSprite3D()
Rotate=0
Open_Window_0()
OpenWindowedScreen(WindowID(),0,0,400,400,0,0,0)
OpenLibrary(0, "AVICAP32.DLL")
hRobby = CallFunction(0, "capCreateCaptureWindowA", "Test", #WS_CHILD, 0, 0, 384, 288, hWnd, 0)
SendMessage_(hRobby, #WM_CAP_DRIVER_CONNECT, 0 , 0)
Sprite3DQuality(1)
CreateSprite(#Link2,128,128,#PB_Sprite_Texture)
*Pointer =AllocateMemory(128*128*4)
*Pointer2=AllocateMemory(128*128*4)
Rausch=20
Repeat
Event = WindowEvent() ; This line waits until an event is received from Windows
; WaitWindowEvent()
WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures
GadgetID = EventGadgetID() ; Is it a gadget event?
EventType = EventType() ; The event type
Link = GetClipboardData(#PB_ClipboardImage)
If Link <> 0
ClearScreen(0,0,0) ; Schwarz
StartDrawing(SpriteOutput(#Link2))
DrawImage(Link,0,0,128, 128)
*Bild=DrawingBuffer()
CopyMemory(*Bild, *Pointer, 128*128*4)
If DrawingBufferPixelFormat() = #PB_PixelFormat_32Bits_BGR : DrawText("32 Bit BGR") : EndIf
StopDrawing()
CopySprite(#Link2, #Link3, #PB_Sprite_Texture)
CreateSprite3D(#Sprite3D, #Link3)
;{- Berechnungen
;R=-10+Random(Rausch)
For i2=0 To 126 ; Bei 127 gibts noch ungeklärte Probleme
For i=0 To 127
P=127-i
Farbe(0)=PeekB(*Pointer+i2*128*4+P*4+0)
Farbe(1)=PeekB(*Pointer+i2*128*4+P*4+1)
Farbe(2)=PeekB(*Pointer+i2*128*4+P*4+2)
Farbe(3)=PeekB(*Pointer+i2*128*4+P*4+3)
Farbe(4)=(Farbe(0)+Farbe(1)+Farbe(2))/3 ; Grau ... aber irgendwie nicht richtig
;R=Random(Rausch)
PokeB(*Pointer2+i2*128*4+i*4+0, Farbe(2)+R) ; Blue
PokeB(*Pointer2+i2*128*4+i*4+1, Farbe(2)+R); Green
PokeB(*Pointer2+i2*128*4+i*4+2, Farbe(2)+R); Red ... Rot ist am hellsten
PokeB(*Pointer2+i2*128*4+i*4+3, Farbe(3)) ; Alpha
Next i
Next i2
;}- Ende Berechnungen
CopyMemory(*Pointer2, *Bild, 128*128*4)
CreateSprite3D(#Sprite3D2, #Link2)
Rotate=(Rotate+3)%360
ZoomSprite3D(#Sprite3D2,192,144)
; RotateSprite3D(#Sprite3D,Rotate,0)
Start3D()
DisplaySprite3D(#Sprite3D, 60, 60)
DisplaySprite3D(#Sprite3D2, 180, 180)
Stop3D()
EndIf
;/
SendMessage_(hRobby, #WM_CAP_GRAB_FRAME, 0 , 0)
SendMessage_(hRobby, #WM_CAP_EDIT_COPY, 0 , 0) ; SendMessage_(hRobby, #WM_CAP_EDIT_COPY ,0,0); kopiert Bild ins Clipboard
Delay(10) ; Prozessorauslastung verhindern ... vielleicht ;-)
FlipBuffers()
Until Event = #PB_Event_CloseWindow ; End of the event loop
SendMessage_(hRobby, #WM_CAP_SET_PREVIEW, 0, 0)
SendMessage_(hRobby, #WM_CAP_DRIVER_DISCONNECT, "Test", 0)
CloseWindow(0)
CloseLibrary(0)
End
Aber das Grundgerüst für schnellen Zugriff ist gegeben.
Mag jemand vielleicht mit mir zusammen einen Algorithmus entwickeln, der aus der VideoQuelle ... geometrische Formen erkennen kann ...
selbstverständlich mit einer gewissen Tolleranz.
Linienstärke, Winkel, Längen ...
Ziel soll sein: Oh, ich sehe einen roten Kreis
Ah, da ist ein Quadrat mit einem Winkel relativ zur unteren Bildschirmkante von 45° ... (oder auch ein Karo

Und das Quadrat besteht selbst aus Linien.
Ich würde mich schon freuen, wenn ich überhaupt eine schwarze Linie auf weißen Untergrund ermitteln kann und vielleicht noch ihre Drehung errechnen kann.
