PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bewegungsverfolgung



MisterMou
12.06.2010, 09:23
Hallo,

ich bastel gerade an einem zielsuchendem Kamerastativ.

Das Konzept ist eigendlich ganz einfach, man nehme eine Selbstschussanlage (Turret bei Youtube) und baue anstatt einer Waffe eine Kamera an.

So weit, so gut, ich scheiter an dem Problem der schnellen Bewegungsverfolgung.
Ich progge in VB.net, zur Zeit schrumpfe ich das Webcambild auf 80x60px und vergleiche dann Pixel für Pixel, mit dieser Variante komm ich auf vllt 13fps, wenn ich die Servosteuerung laufen lass sinds noch 8fps, wenn überhaupt.
Das ist nicht sonderlich prall, und ich nutze schon einen 2er Dualcore, wenn ich seh das sone embeddet Boards viel schneller sind, beschleicht mich die Frage, wie machen die das?

Kann mal jemand eine Vorgehensweise in den Raum werfen?
Oder zumindest nen Vorschlag.

p_mork
12.06.2010, 10:14
Das ist nicht sonderlich prall, und ich nutze schon einen 2er Dualcore, wenn ich seh das sone embeddet Boards viel schneller sind, beschleicht mich die Frage, wie machen die das?

Die sind schneller, weil der Code dort nativ ausgeführt wird. Das .net Framework basiert auf einer VM, und da darf man sich nicht wundern, dass der Code dann um einiges langsamer läuft. Bildverarbeitung ist halt rechenintensiv. Nimm eine Lib wie openCV, dann kriegst Du locker 30fps mit VGA Auflösung.

Wie genau vergleichst Du die Pixel? 13 fps bei der Auflösung sind eigentlich auch für eine VM viel zu wenig. Etwas Quelltext wär nicht schlecht.

MfG Mark

MisterMou
12.06.2010, 10:45
Ich bin noch n Anfänger im Programmieren :-$




VB.net 2008

For i2 = 0 To pic_neu.Width - 1

For i = 0 To pic_neu.Height - 1

PixelY = i
PixelX = i2
PixelwertOrginal = pic_neu.GetPixel(PixelX, PixelY)
PixelwertVergleich = pic2_neu.GetPixel(PixelX, PixelY)

p1R = CInt(PixelwertVergleich.R)
p1G = CInt(PixelwertVergleich.G)
p1B = CInt(PixelwertVergleich.B)

p2R = CInt(PixelwertOrginal.R)
p2G = CInt(PixelwertOrginal.G)
p2B = CInt(PixelwertOrginal.B)

p1R = ((p1R + p1G + p1B) / 3) - ((p2R + p2G + p2B) / 3)

If p1R <= tbEmpfindlichkeit.Value And p1R > tbEmpfindlichkeit.Value * -1 Then 'Ich bin zu faul das aufs Gegenteil umzudenken^^

Else
SchnittY = SchnittY + i
ZählerY = ZählerY + 1
SchnittX = SchnittX + i2
ZählerX = ZählerX + 1
End If

Next
Next

If-Else Bedingung: Ich berechne später den Duchschitt aus allen Differenzpixeln und ziele dahin, um es einfach auszufrücken.


Ich zeichne das Bild vorher in ne PictureBox und les dann die Pixel aus.
Bremst bestimmt ganzschön.

p_mork
12.06.2010, 12:36
Ich zeichne das Bild vorher in ne PictureBox und les dann die Pixel aus.
Bremst bestimmt ganzschön.


Das wirds wohl sein. Besorg Dir das RGB-Array der beiden Bilder, dann sollte es um einiges schneller sein. Was sich auch optimieren lässt ist das Teilen durch 3, indem man es weglässt und stattdessen tbEmpfindlichkeit.Value entsprechend skaliert.

MfG Mark

MisterMou
12.06.2010, 13:28
Boing. Übersehen.

Ich hab das durch 3 teilen rausgenommen und die Kiste überschlägt sich fast. Das sind jetzt locker 15fps mit Servoansteuerung, das kann doch nicht nur am Code gelegen haben...

Das Array werd ich mir auch noch fertig machen.

Schonmal danke!

oratus sum
17.06.2010, 17:06
Du hast aber so genau ein Thread mit deiner Schleife, das ist wirklich langsam. Du hast in VB.Net den background Worker. Erstelle dir 9 von denen, das entspricht 9 Threads. Dann teilst du dein Bild in 8 Segmente auf und gibst ein Segment einem Worker. Die Worker übergeben dannd ie Ergebnise dem 9. Worker der diese dann auswertet.

VB.NET ist ziemlich gut ich progge sehr gerne damit, weils recht simpel ist.

Achja...

Schau dir mal das an:
http://www.mitov.com/

Geh dort auf Videlab.
Da gibts alles was das Herz begehrt. Canny Filter, Kantenfilter, Bewegungserkennung alles alles alles, DirectX Input ALLES

das beste: es ist völlig UMSONST (für private Zwecke)

Ich habe alle drei Libraries.

Du installierst es einfach und die Komponenten sind dann zur Verwendung bereit.

EMPFEHLENSWERT!