2016-05-11 29 views
5

Ich versuche Bilder von der Webcam mit Opencv und Python zu bekommen. Code ist so einfach wie:BeagleBone Black OpenCV Python ist zu langsam

import cv2 
import time 
cap=cv2.VideoCapture(0) 
cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,640) 
cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,480) 
cap.set(cv2.cv.CV_CAP_PROP_FPS, 20) 

a=30 
t=time.time() 
while (a>0): 
     now=time.time() 
     print now-t 
     t=now 
     ret,frame=cap.read() 
     #Some processes 
     print a,ret 
     print frame.shape 
     a=a-1 
     k=cv2.waitKey(20) 
     if k==27: 
       break 
cv2.destroyAllWindows() 

Aber es funktioniert langsam. Ausgabe des Programms:

VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
VIDIOC_QUERYMENU: Invalid argument 
HIGHGUI ERROR: V4L: Property <unknown property string>(5) not supported by device 
8.82148742676e-06 
select timeout 
30 True 
(480, 640, 3) 
2.10035800934 
select timeout 
29 True 
(480, 640, 3) 
2.06729602814 
select timeout 
28 True 
(480, 640, 3) 
2.07144904137 
select timeout 

Konfiguration:

  • BeagleBone Schwarz REVC
  • Debian-wheezly
  • opencv 2.4
  • Python 2,7
+1

Für dieses Problem wird nicht es wahrscheinlich helfen, aber wenn man opencv verwenden zu cv Sachen eigentlich tun, wollen Sie wahrscheinlich, dass die opencv überprüfen Sie verwenden gegen die NEON-Erweiterungen kompiliert wird. (google opencv beaglebone neon wird wahrscheinlich nützliche Details finden, zB http://blog.lemoneerlabs.com/3rdParty/Darling_BBB_30fps_DRAFT.html) – Foon

+0

"opencv 2.4" - Sie müssen spezifischer sein, es gab eine Anzahl von 2.4 .x Releases von OpenCV über mehrere Jahre. –

Antwort

3

ich ein ähnliches Problem aufgetreten, wenn ich auf eine arbeitete Projekt mit OpenCV 2.4.9 auf der Intel Edison-Plattform. Vor jeder Verarbeitung dauerte es ungefähr 80 ms, nur um die Bildaufnahme durchzuführen. Es stellt sich heraus, dass OpenCVs Kameraerfassungslogik für Linux nicht korrekt implementiert ist, zumindest nicht in Version 2.4.9. Da der zugrundeliegende Treiber nur einen Puffer verwendet, ist es nicht möglich, Multi-Threading in der Anwendungsebene zu verwenden, um es zu umgehen - bis Sie versuchen, den nächsten Frame zu greifen, ist der einzige Puffer im V4L2-Treiber gesperrt.

Die Lösung besteht darin, OpenCVs VideoCapture-Klasse nicht zu verwenden. Vielleicht wurde es behoben, um irgendwann eine vernünftige Anzahl von Puffern zu verwenden, aber ab 2.4.9 war es das nicht. In der Tat, wenn Sie Artikel des gleichen Autors als den Link von @Nickil Maveli, Sie finden, dass, sobald er Vorschläge zur Verbesserung der FPS auf einem Raspberry Pi bietet, hört er auf OpenCVs VideoCapture. Ich glaube nicht, dass das ein Zufall ist.

Hier ist mein Beitrag darüber auf dem Intel Edison-Forum: https://communities.intel.com/thread/58544.

Ich habe im Grunde genommen meine eigene Klasse geschrieben, um die Framegrabber zu verarbeiten, direkt mit V4L2. Auf diese Weise können Sie eine ringförmige Liste von Puffern bereitstellen und ermöglichen, dass die Frame-Grabbing- und Anwendungslogik ordnungsgemäß entkoppelt wird. Dies wurde jedoch in C++ für eine C++ - Anwendung getan. Unter der Annahme, dass der oben genannte Link seine Versprechen hält, könnte das ein viel einfacherer Ansatz sein. Ich bin mir nicht sicher, ob es auf BeagleBone funktionieren würde, aber vielleicht gibt es da draußen etwas ähnliches wie PiCamera. Viel Glück.

EDIT: Ich habe mir den Quellcode für 2.4.11 von OpenCV angeschaut. Es sieht so aus, als würden sie jetzt standardmäßig 4 Puffer verwenden, aber Sie müssen V4L2 verwenden, um dies zu nutzen. Wenn Sie sich Ihre Fehlermeldung HIGHGUI ERROR: V4L: Property... genau anschauen, sehen Sie, dass sie auf V4L und nicht auf V4L2 verweist. Das bedeutet, dass der Build von OpenCV, den Sie verwenden, auf den alten V4L-Treiber zurückgreift. Zusätzlich zu dem singulären Puffer, der Leistungsprobleme verursacht, verwenden Sie einen alten Treiber, der wahrscheinlich viele Einschränkungen und Leistungsprobleme hat.

Ihre beste Wette wäre, OpenCV selbst zu bauen, um sicherzustellen, dass es V4L2 verwendet. Wenn ich mich richtig erinnere, überprüft der OpenCV-Konfigurationsprozess, ob die V4L2-Treiber auf dem Rechner installiert sind und baut sie dementsprechend auf. Sie sollten also sicherstellen, dass V4L2 und alle zugehörigen Dev-Pakete auf dem Rechner installiert sind, auf dem Sie OpenCV bauen.

+0

der Puffer ist im Hardware-Speicher ich denke (aus meiner Erfahrung). – user5698387

3

Die "Geheimnis" zu erhalten ein höherer FPS bei der Verarbeitung von Videoströmen mit OpenCV besteht darin, die E/A (d. h. das Lesen von Frames von dem Kamerasensor) zu einem separaten Thread zu bewegen.

Beim Aufruf read() Methode zusammen mit cv2.VideoCapture Funktion macht es den gesamten Prozess sehr langsam, da es für jede E/A-Operation warten muss abgeschlossen werden, damit ihn auf den nächsten zu bewegen (Blocking Process).

Um diese FPS-Erhöhung/Latenz zu reduzieren, ist unser Ziel, das Lesen von Frames von einer Webcam oder einem USB-Gerät in einen völlig anderen Thread zu verschieben, völlig getrennt von unserem Haupt-Python-Skript.

Damit können Frames kontinuierlich vom I/O-Thread gelesen werden, während unser Root-Thread den aktuellen Frame verarbeitet. Sobald der Stamm-Thread seinen Frame fertig bearbeitet hat, muss er einfach den aktuellen Frame aus dem I/O-Thread entnehmen. Dies wird erreicht, ohne auf blockierende E/A-Operationen warten zu müssen. Sie können Increasing webcam FPS with Python and OpenCV lesen, um die Schritte bei der Implementierung von Threads zu kennen.


EDIT

Basierend auf den Diskussionen in unseren Kommentaren, ich fühle mich Sie könnten den Code wie folgt umschreiben:

import cv2 

cv2.namedWindow("output") 
cap = cv2.VideoCapture(0) 

if cap.isOpened():    # Getting the first frame 
    ret, frame = cap.read() 
else: 
    ret = False 

while ret: 
    cv2.imshow("output", frame) 
    ret, frame = cap.read() 
    key = cv2.waitKey(20) 
    if key == 27:     # exit on Escape key 
     break 
cv2.destroyWindow("output") 
+0

Ich habe die gleichen Dinge, aber Python und opencv immer noch zu langsam – acs

+0

Versuchen Sie, setzen Sie Ihre Kamera fps auf 'cap.set (cv2.cv.CV_CAP_PROP_FPS, 30)' und sehen Sie die Ergebnisse. –

+0

Immer noch gleich. in Frage bearbeitet – acs

1

versuchen Sie diese! Ich ersetzen einige Codes in der cap.set() Abschnitt

import cv2 
import time 
cap=cv2.VideoCapture(0) 
cap.set(3,640) 
cap.set(4,480) 
cap.set(5, 20) 

a=30 
t=time.time() 
while (a>0): 
     now=time.time() 
     print now-t 
     t=now 
     ret,frame=cap.read() 
     #Some processes 
     print a,ret 
     print frame.shape 
     a=a-1 
     k=cv2.waitKey(20) 
     if k==27: 
       break 
cv2.destroyAllWindows() 

Ausgang (PC-Webcam) Code falsch war für mich.

>>0.0 
>>30 True 
>>(480, 640, 3) 
>>0.246999979019 
>>29 True 
>>(480, 640, 3) 
>>0.0249998569489 
>>28 True 
>>(480, 640, 3) 
>>0.0280001163483 
>>27 True 
>>(480, 640, 3) 
>>0.0320000648499 
+0

Die ursprünglichen 'cap.set' Funktionsaufrufe waren in Ordnung. Die verwendeten Konstanten @acs entsprechen denselben Werten, die Sie manuell angegeben haben. Das ist nicht die Ursache für das Leistungsproblem. – Aenimated1

Verwandte Themen