2016-11-06 34 views
11

zauważyłem coś bardzo dziwny próbując detektor ruchu dla Raspberry Pi:Dlaczego właśnie importowanie OpenCV powoduje ogromne wykorzystanie procesora?

Zdejmowanie rejestrowanie kamery ze skryptu, czyni go używać prawie 0 CPU:

#from gpiozero import MotionSensor 
#import cv2 
from datetime import datetime 
from time import sleep 
#camera = cv2.VideoCapture(0) 
#pir = MotionSensor(4, queue_len=2, sample_rate=2, threshold=0.5) 
import RPi.GPIO as GPIO 
GPIO.setmode(GPIO.BCM) 
PIR_PIN = 4 
GPIO.setup(PIR_PIN, GPIO.IN) 
while True: 
    sleep(1) 
    if GPIO.input(PIR_PIN): 
     print("detected!") 
     filename = 'motionpics/' + datetime.now().strftime("%Y-%m-%d_%H.%M.%S.jpg") 
     #ret, frame = camera.read() 
     #cv2.imwrite(filename, frame) 
     #camera.release() 
     #pir.wait_for_no_motion() 

Jednak odkomentowanie tylko jedną linię - import cv2 powoduje, że skrypt ten przechodzi do 300% użycia procesora !!

Co jest nie tak z OpenCV i dlaczego nie mogę nawet zacząć używać go do robienia zdjęć z kamer USB bez użycia pęczka procesora i wyczerpania baterii?

+3

Zauważam dokładnie ten sam problem na moim Raspberry Pi3. Próbowałem zainstalować OpenCV3.2-dev, korzystając z dokładnych informacji wymienionych na blogu Pyimagesearch, ale po prostu zaimportowanie biblioteki sprawiło, że mam 75% CPU. Próba przechwycenia ramki z mojej kamery USB powoduje, że program się nie przejmuje. Korzystanie z najnowszych Raspbian (Pixel) i python 3.4. –

+0

Czy możesz dołączyć do swojej aplikacji za pomocą 'gdb' (' gdb -p pid_of_it') i sprawdzić wszystkie stany wątków ('info threads',' thread 1', 'backtrace',' thread 2', 'backtrace' i tak dalej).Myślę, że może to być coś w rodzaju równoległych wątków, gotowych do pracy i odpytywania w trybie pracy (jak aktywny tryb OpenMP lub TBB). Proszę również opublikować wynik polecenia 'env' (tutaj mogą występować zmienne związane z OMP lub CV lub TBB). (Cross post przez Tyler: http://raspberrypi.stackexchange.com/questions/63021). Jaka jest twoja wersja opencv (i obrazu głównego), jak skompilowano bibliotekę cv i czym jest 'ldd .../libopencv.so'? – osgx

Odpowiedz

9

Hmmmm, jeśli się nie mylę, opencv potrzebuje numpy, prawda? Można spróbować następujących czynności:

$ sudo apt-get install libatlas3-base 
$ sudo update-alternatives --config libblas.so.3 

wybrać opcję libatlas

$ sudo update-alternatives --config liblapack.so.3 

wybrać opcję libatlas

$ sudo aptitude purge libopenblas-{base,dev} 

Source

5

Mogę potwierdzić, że odpowiedź Giannis' jest poprawna. Właśnie wykonałem kroki wymienione w jego odpowiedzi i jestem w stanie zaimportować cv2 w pythonie 3.4 bez użycia wysokiego cpu. Przynajmniej tak jest. Mogę pobrać ramkę i wyświetlić obraz. Działa to w moim przypadku użycia.

Zauważyłem jednak, że podczas wyżej wymienionych kroków, libtiff5, wolfram i kilka innych bibliotek zostało odinstalowanych.

Jeśli potrzebujesz tych bibliotek i aplikacji (nie mam pełną listę w tej chwili) Ja polecam chwilowo NIE wykonywania

sudo apt-get dist-upgrade

I

Sudo rpi-update

W tym czasie i pozostań przy raspbian jessie. To jest po prostu z mojego osobistego doświadczenia.

EDIT:

Również chciałbym dodać, że Giannis miał rację, to pozornie numpy problem i może być łatwo testowane przez proste:

dzieje pulpicie-Twojego malinowy PI3 za> Menu Start -> Kod-> Python 3; wpisz "import numpy" (bez cudzysłowów).

Powinieneś zobaczyć użycie procesora przez dach. Jest to sposób informowania, że ​​jesteś uprawniony do działania tej poprawki.

+0

Chciałbym również dodać, że Giannis miał rację, jest to pozornie odległy problem i można go łatwo przetestować po prostu: wchodząc na pulpicie Raspberry Pi3-> Menu Start-> Kod-> Python 3; wpisz "import numpy" (bez cudzysłowów). Powinieneś zobaczyć użycie procesora przez dach. Jest to sposób informowania, że ​​jesteś uprawniony do działania tej poprawki. –

+0

Możesz edytować własną odpowiedź, dodając odpowiednie informacje do komentarza. –

+0

Whoops. Słuszna uwaga. Nie miałem już żadnego powtórzenia, więc nie pozwalałem mi robić takich rzeczy jak edytowanie/komentowanie w kilku miejscach. Zrobione. –