Python 为什么仅仅导入OpenCV会导致大量CPU使用?

Python 为什么仅仅导入OpenCV会导致大量CPU使用?,python,opencv,raspberry-pi3,Python,Opencv,Raspberry Pi3,我在尝试树莓皮的运动检测器时发现了一些非常奇怪的东西: 从脚本中删除摄影机日志记录,使其几乎使用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)

我在尝试树莓皮的运动检测器时发现了一些非常奇怪的东西:

从脚本中删除摄影机日志记录,使其几乎使用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()
然而,只取消注释一行——导入cv2,使该脚本的CPU使用率达到300%


OpenCV有什么问题?为什么我甚至不能开始使用它来抓取usb摄像头图像,而不使用一堆cpu,也不消耗电池?

Hmmmm,如果我没有弄错的话,OpenCV需要numpy,对吗?你能试一下吗

$ sudo apt-get install libatlas3-base
$ sudo update-alternatives --config libblas.so.3
选择libatlas选项

$ sudo update-alternatives --config liblapack.so.3
$ sudo aptitude purge libopenblas-{base,dev}
选择libatlas选项

$ sudo update-alternatives --config liblapack.so.3
$ sudo aptitude purge libopenblas-{base,dev}

我可以确认吉安尼斯的回答是正确的。我只是执行了他回答中列出的步骤,并且能够在不占用大量cpu的情况下在Python3.4中导入cv2。所以至少是这样。我能够抓取一帧并显示图像。这适用于我的用例

但是,我注意到在上述步骤中,libtiff5、wolfram和其他几个库被卸载

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

Sudo apt获得dist升级

sudorpi更新

在这个时候,我将继续留在拉斯宾·杰西。这是我个人的经历

编辑:


此外,我还想补充一点,吉安尼斯是对的,这似乎是一个重大问题,可以通过以下方式轻松测试:

在Raspberry Pi3的桌面->开始菜单->代码->Python 3;键入“import numpy”(不带引号)


你应该看到你的cpu使用率达到了顶峰。这是一种告诉您有资格进行此修复的方式。

我一直在我的Raspberry Pi3上注意到完全相同的问题。我曾尝试使用Pyimagesearch博客上列出的详细信息安装OpenCV3.2-dev,但仅仅导入库就让我的CPU占用了75%。试图从我的USB摄像头抓取一帧会导致程序无法重新启动。使用最新的Raspbian(Pixel)和python 3.4.0,您可以使用
gdb
gdb-p pid_of_it
)连接到应用程序并检查所有线程状态(
info threads
thread 1
backtrace
thread 2
backtrace
等等)。我认为它可以来自某种类型的并行线程,准备工作并在工作队列上轮询(如OpenMP或TBB的活动模式)。请同时发布
env
命令的结果(此处可能有OMP、CV或TBB相关变量)。(泰勒交叉发帖:)。你的opencv(和根图像)版本是什么,cv库是如何编译的,什么是
ldd…/libopencv.so
?我还想补充一点,Giannis是对的,这似乎是一个很重要的问题,可以简单地通过以下方法进行测试:打开Raspberry Pi3的桌面->开始菜单->代码->Python 3;键入“import numpy”(不带引号)。你应该看到你的cpu使用率达到了顶峰。这是一种告诉您有资格使用此修复程序的方式。您可以编辑自己的答案,以包含您的评论中的相关信息。哇。说得好。我再也没有代表了,所以它不允许我在一些地方做编辑/评论之类的事情。我甚至不能理解这个问题和这个答案之间的关系。但我知道这个答案是正确的。我真佩服你!请给出一些解释,使这个答案更一般,谢谢!