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.
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.
MfG Xtreme
RP6 Test - alles zum Nachfolger des bekannten RP5 im neuen RP6 Forum!
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...
MfG Xtreme
RP6 Test - alles zum Nachfolger des bekannten RP5 im neuen RP6 Forum!
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...
MfG Xtreme
RP6 Test - alles zum Nachfolger des bekannten RP5 im neuen RP6 Forum!
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
MfG Xtreme
RP6 Test - alles zum Nachfolger des bekannten RP5 im neuen RP6 Forum!
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
Lesezeichen