Kennst du dieses Video:
9fps sollten schon möglich sein. Allerdings wird hier ein RasPi mit 512MB verwendet.
Das lustige ist, dass so viele Leute zum Holen des Bildes von der Kamera ohne irgendwelche anderen Algorithmen schon nur 3-4fps haben. Beim OP wird das jetzt schneller gehen, wenn er wirklich bei jedem Durchlauf die Kamera initialisiert hat, aber das gilt für viele der anderen Leidensgenossen nicht. OpenCV scheint da sehr verschwenderisch mit den Resourcen umzugehen.
OK, danke. Das Initialisieren hatte ich leider nicht in der Schleife. Habe mich vertippt. Schade eigentlich. Die Lösung wäre einfach gewesen.
Hier mein Code. Ich mache das in der Schleife. Danach gehe ich durch die Elemente in contour. Es werden sehr viele gefunden. Das macht alles sehr langsam. Wo ist der Fehler!?
Code:color_image = cv.QueryFrame(self.capture) cv.Smooth(color_image, color_image, cv.CV_GAUSSIAN, 3, 0) cv.Threshold(grey_image, grey_image, 70, 255, cv.CV_THRESH_BINARY) down = cv.Scalar(10,100,100,0) # cv.Scalar(30,100,100) # up = cv.Scalar(40, 255,255,0) #(35,255,255) imghsv=cv.CreateImage(cv.GetSize(color_image),8,3) cv.CvtColor(color_image,imghsv,cv.CV_BGR2HSV) # Convert image from RGB to HSV imgyellow=cv.CreateImage(cv.GetSize(color_image),8,1) imgthreshold=cv.CreateImage(cv.GetSize(color_image),8,1) cv.InRangeS(imghsv,down,up,imgyellow) # Select a range of yellow color storage = cv.CreateMemStorage(0) contour = cv.FindContours(imgthreshold, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE)
OpenCV ist hier eher resourcenschonend. Meist ist das Problem nicht die Software sondern die Verbindung. Bsp. USB 1 statt USB 2. Auch in der industriellen Bildverarbeitung ist das reine Bild einziehen meist sehr untergeordnet. Die Anzeigealgorithmen haben bsp. nichts mit dem Bildeinzug gemein. Wenn es um den Bildeinzug geht, eben nur einziehen und nicht anzeigen. Hier ist dann auch nochmal ein Flaschenhals. Bsp. nicht funktionierende Hardwarebeschleunigung.
Gruß
Georg
Ich habe die hier http://download.p4c.philips.com/file...00_pss_deu.pdf
Der Code dort oben kommt auf 10 fps. Problem ist, das Durchlaufen durch die "contour" (Liste).
Code:while contour: bound_rect = cv.BoundingRect(list(contour)) contour = contour.h_next() pt1 = (bound_rect[0], bound_rect[1]) pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3]) points.append(pt1) points.append(pt2) centroidx=cv.Round((pt1[0]+pt2[0])/2) centroidy=cv.Round((pt1[1]+pt2[1])/2) centroid = (centroidx, centroidy) if len(points): radius = abs(pt1[0]-pt2[0])/2 if True: #radius > 2 and radius != 159: self.centroid = centroid self.radius = radius if self.gui is True: cv.Circle(color_image, centroid , radius , cv.CV_RGB(255,0,0), 1) cv.Rectangle(color_image, pt1, pt2, cv.CV_RGB(255,0,0), 1) cv.PutText(color_image, str(centroid)+" r="+str(radius), centroid, cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 2, 1), cv.CV_RGB(255,0,0)) # print str(centroid)+" r="+str(radius) else: self.centroid = None self.radius = None
Auf meinem Core2Duo mit 1.8GHz schafft der Code im Anhang (deine Schnipsel halbwegs lauffähig gemacht) mit Anzeigefenster auch nur ~22 Frames/s mit einer Playstation Eye (640x480, 30fps), ohne die contour-Liste immerhin 24fps. Ohne Gui schafft er in beiden Fällen fast 30fps. Die 4 fps auf der RasPi scheinen also leider realistisch.
Ein winziges Stück mehr Geschwindigkeit brachte es, das cv.CreateMemStorage(0) vor die Endlos-Schleife zu setzen.
ich könnte mir vorstellen, dass in contour einfach zu viele Objekte drin sind. Vielleicht kann man irgendwie in der Richtung optimieren.
Lesezeichen