Jep... allerdings hab ich die Bilder bis jetzt immer noch "von Hand" geladen. Arbeite gerade daran das Bild direkt von der Cam zu laden. Ich hab schon mal was mit Video Capture gemacht, wird also nicht mehr lange dauern... morgen vieleicht.
Druckbare Version
Jep... allerdings hab ich die Bilder bis jetzt immer noch "von Hand" geladen. Arbeite gerade daran das Bild direkt von der Cam zu laden. Ich hab schon mal was mit Video Capture gemacht, wird also nicht mehr lange dauern... morgen vieleicht.
Hallo Zusammen,
im Moment versuche ich gerade, einen Algorithmus für die Suche nach zwei Objekten in einem Bild zu realisieren.
Es klappt schon, nur ist der Algorithmus noch ein wenig langsam. Die Tiefpassfilterung braucht etwas zuviel Zeit.
Hier eine Beschreibung des Algorithmus zu den obigen Bildern ( gestern war's schon etwas zu spät ):
Bild1: Orginalbild
Bild2: Rote Farben mittels des Algoritnus wie weiter oben im Thread beschrieben extrahiert und in eine Pixelbild umgewandelt
Bild3: tiefpassgefiltertes Pixelbild, durch die Tiefpassfilterung werden aus den ebenen weißen Fläche kleine Berge
Bild4: Höchste Bergspitze gesucht und Berg mittels Überzeichnen aus dem Bild entfernt danach suchen der zweiten Bergspitze
Bild5: Position der beiden gefundenen Bergspitzen
Mich würde mal interessieren, was ihr von dem Algorithmus haltet. Er funktioniert, aber vielleicht hat ja noch jemand eine andere Idee ?
Gruss,
stochri
Hallo, ich speichere die VideoCapturebilder der Cam über die Ablage in ein Picturefenster zum auswerten.
Ich Progge in Purebasic.
Ich Teste es zur Zeit über einen Button. Links ist das Videocapturebild (25 B/sec) und rechts wird nach dem Buttondrücken ein Picturebild dargestellt zum auswerten.
Eine andere schnellere Lösung als über die Ablage habe ich nicht gefunden.
CastleCode:; PureBasic Visual Designer v3.92 build 1460
IncludeFile "inc.pb"
#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
Open_Window_0()
OpenLibrary(0, "AVICAP32.DLL")
hRobby = CallFunction(0, "capCreateCaptureWindowA", "Test", #WS_VISIBLE + #WS_CHILD, 120, 30, 300, 300, hWnd, 0)
SendMessage_(hRobby, #WM_CAP_DRIVER_CONNECT, 0 , 0)
SendMessage_(hRobby, #WM_CAP_SET_SCALE , 1 , 0)
SendMessage_(hRobby, #WM_CAP_SET_PREVIEWRATE, 50, 0)
SendMessage_(hRobby, #WM_CAP_SET_PREVIEW, 1 , 0)
Repeat ; Start of the event loop
Event = WaitWindowEvent() ; This line waits until an event is received from Windows
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
;You can place code here, and use the result as parameters for the procedures
If Event = #PB_EventGadget
If GadgetID = #Button_0
If Link <> 0
StartDrawing( WindowOutput() )
DrawImage(Link, 440,30,300, 300)
StopDrawing()
EndIf
EndIf
EndIf
SendMessage_(hRobby, #WM_CAP_GRAB_FRAME, 0 , 0)
SendMessage_(hRobby, #WM_CAP_EDIT_COPY, 0 , 0)
Link = GetClipboardData(#PB_ClipboardImage)
Delay(1)
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
;
In Delphi gibt es sowas wie Copyrect... so machs ich jedenfalls!
Werde heute Abend mal das Progrmm hochladen...
So, in meiner Galerie befindet sich jetzt ein Screenshot des Programms.
Bearbeitungszeit auf meinem 1,5 GhZ Rechner: ca. 450 ms
Auf meiner 3500 er Kiste läuft die Webcam komischerweiße net... muss ich mir mal genauer anschaun...
Hallo,
ich hab' mir jetzt eine WebCam zugelegt. Zur Zeit versuche ich mich darin, die Bilder mit einem VB-Programm einzulesen. Als Vorlage habe ich leider nur ein Programm in C++, das aber ekelhaft viele API-Funktionen über DirectX aufruft. Hat jemand eine Idee, wie es einfacher geht?
Hier der VB-Code (Auszüge) zur ermittlung der Schwerpunkt-Koordinaten:
@storchi: Ich habe die ersten Experimente mit SCILAB gemacht. Damit kann man sicher gut Versuche anstellen. Vielen Dank noch einmal für den Hinweis auf das Tutorial.Code:....
bmpOrig ist eine Bitmap und enhält das Bild.
Dim mXRed As Integer, cXRed As Integer
Dim mYRed As Double, cYRed As Integer
Dim mXGreen As Integer, cXGreen As Integer
Dim mYGreen As Double, cYGreen As Integer
Dim x, y As Integer
Dim c As Color
Dim Hue As Integer
Dim Saturation As Integer
Dim Brightness As Integer
For y = 0 To bmpOrig.Height - 1
For x = 0 To bmpOrig.Width - 1
c = bmpOrig.GetPixel(x, y)
Hue = CInt(c.GetHue())
Saturation = CInt(c.GetSaturation() * 100)
Brightness = CInt(c.GetBrightness() * 100)
If (Hue > 355 Or Hue < 5) And (Saturation > 70) And Brightness > 35 Then
'roter Punkt, Farbwert (Hue) zwischen 355 .. 360 / 0 .. 5
mXRed += x 'Summe der x-Koordinaten mit roten Pixel
mYRed += y
cXRed += 1 'Anzahl der x-Koordinaten mit rotem Pixel
cYRed += 1
ElseIf (Hue > 105 Or Hue < 120) And (Saturation > 70) And Brightness > 35 Then
'grüner Punkt, Hue zwischen 105 .. 120
mXGreen += x
mYGreen += y
cXGreen += 1
cYGreen += 1
Else
'irgendeine andere Farbe
End If
Next
Next
mXRed = CInt(mXRed / cXRed) 'Mittelwert der x-Koordinaten mit rotem Pixel = x-Koordinate des Schwerpunkts
mYRed = CInt(mYRed / cYRed)
mXGreen = CInt(mXGreen / cXGreen)
mYGreen = CInt(mYGreen / cYGreen)
Gruß Red Baron
xtreme, warum machst du das videocapturebild von der cam nicht ins gleiche fenster, sieht doch besser aus, als wenn es daneben hängt. es gibt dafür schöne videobefehle in der avicap32.dll :
#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
Castle
Ja, dir kenn ich... verwende die auch für das Cam Fenster...
Keine Ahnung warum ich das so gemacht hab ;-)
Hallo RedBaron,
Schön, dass Du SCILAB ausprobiert hast. Es ist schon ganz gut, um mal schnell Experimente zu machen. Mittlerweile bin ich noch auf eine andere Toolbox gestossen: SIVP für Scilab. Leider hab ich die bis jetzt noch nicht zum Laufen gekriegt. Die benutzt die Open-Soruce Bildverarbeitungsroutinen OpenCV von Intel. Kennst Du diese Bibliothek ? Eine riesige Sammlung von Funktionen in C. Wenn Du also gerne weiter in C-Programmieren möchtest: dort findest Du alles, was für die Bildverarbeitung nötig ist. Allerdings kommt man natürlich vom hundersten ins tausendste. Eigentlich wollte ich nur eine Routine für eine schnelles vergrößern und Verkleinern des Bildes. Aber jetzt bin ich an der OpenCV hängen geblieben. Die Routinen sind natürlich optimiert für Intel-Prozessoren, aber auf meinem AMD lassen die sich auch kompliieren. Ich nehme mal an, dass sie dort halt langsamer laufen.
Wenn Du also genügend Zeit hast: .... OpenCV !
Gruss,
stochri