为什么只导入OpenCV导致大量CPU使用?

NoB*_*ugs 11 python opencv raspberry-pi3

在为Raspberry Pi尝试运动检测器时,我注意到了一些非常奇怪的事情:

从脚本中删除摄像机记录,使其几乎使用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()
Run Code Online (Sandbox Code Playgroud)

但是,取消注释只有一行 - 导入cv2,使这个脚本达到300%的CPU使用率!!

OpenCV有什么问题,为什么我不能开始使用它来获取usb相机图像而不使用一堆cpu,并且耗尽电池?

Gia*_*los 10

嗯,如果我没弄错,opencv需要numpy吧?你能尝试以下方法吗?

$ sudo apt-get install libatlas3-base
$ sudo update-alternatives --config libblas.so.3
Run Code Online (Sandbox Code Playgroud)

选择libatlas选项

$ sudo update-alternatives --config liblapack.so.3
Run Code Online (Sandbox Code Playgroud)

选择libatlas选项

$ sudo aptitude purge libopenblas-{base,dev}
Run Code Online (Sandbox Code Playgroud)

资源


小智 5

我可以确认Giannis的回答是正确的.我刚刚执行了他的答案中列出的步骤,并且能够在没有高CPU使用率的情况下在python 3.4中导入cv2.所以至少有那个.我能够抓住一个框架并显示一个图像.这适用于我的用例.

我注意到,在上述步骤中,libtiff5,wolfram和其他几个库都被卸载了.

如果您需要这些库和应用程序(我目前没有完整列表),我会推荐暂时不执行

Sudo apt-get dist-upgrade

Sudo rpi-update

这时,还留在raspbian jessie.这只是出于个人经验.

编辑:

另外我想补充一点,Giannis是对的,这似乎是一个numpy问题,并且很容易通过以下方式进行测试:

继续你的Raspberry Pi3桌面 - >开始菜单 - >代码 - > Python 3; 键入"import numpy"(不带引号).

您应该看到您的CPU使用率通过屋顶.这是一种告诉您有资格使此修复工作的方式.