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

12

我在尝试为树莓派使用运动检测器时,注意到了一些非常奇怪的事情:

从脚本中删除摄像头日志记录,使其几乎不使用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并且耗尽电池?


3
我在我的Raspberry Pi3上注意到完全相同的问题。我尝试按照Pyimagesearch博客中列出的确切细节安装OpenCV3.2-dev,但只是导入库就让CPU达到75%。尝试从我的USB相机获取一帧会导致程序无响应。使用最新的Raspbian(Pixel)和Python 3.4。 - user6767685
你能否使用 gdb (gdb -p pid_of_it) 连接到你的应用程序,并检查所有线程的状态(info threads, thread 1, backtrace, thread 2, backtrace等)。 我认为它可能是一些并行线程,准备工作并在工作队列上轮询(例如 OpenMP或TBB的活动模式)。请同时发布env命令的结果(这里可能会有与OMP、CV或TBB相关的变量)。(由 Tyler 跨贴:http://raspberrypi.stackexchange.com/questions/63021)。你的 opencv 版本(和根目录映像)是什么,cv lib 是如何编译的,以及ldd .../libopencv.so是什么? - osgx
2个回答

11

嗯,如果我没记错,opencv需要numpy对吧?你能试试下面的方法:

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

选择libatlas选项

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

选择libatlas选项

$ sudo aptitude purge libopenblas-{base,dev}

源代码


我甚至无法理解问题和答案之间的关系,但我知道这个答案是正确的。我非常钦佩你!请给出一些解释,使这个答案更通用,谢谢! - ToughMind

5
我可以确认Giannis的回答是正确的。我刚刚执行了他回答中列出的步骤,并且能够在python 3.4中导入cv2而不会使用高CPU。至少有这个好处。我能够抓取帧并显示图像。这对我的用例有效。
但是,我注意到在上述步骤期间,libtiff5、wolfram和其他几个库被卸载了。
如果您需要这些库和应用程序(我目前没有完整列表),我建议暂时不要执行
Sudo apt-get dist-upgrade 和
Sudo rpi-update 此时,保持在raspbian jessie。这只是我的个人经验。
编辑:
还有我想补充的是Giannis是正确的,这似乎是一个numpy问题,可以通过简单测试来解决:
转到您的Raspberry Pi3的桌面->开始菜单->代码->Python 3;输入“import numpy”(不带引号)。
您应该看到您的CPU使用率飙升。这是一种告诉您是否有资格使用此修复程序的方法。

另外,我想补充一点,Giannis是正确的,这似乎是一个numpy问题,可以通过简单地进行测试:进入您的Raspberry Pi3桌面->开始菜单->代码->Python 3; 输入“import numpy”(不带引号)。您应该会看到CPU使用率飙升。这是一种告诉您是否有资格使此修复程序起作用的方法。 - user6767685
你可以编辑自己的答案,将评论中的相关信息包含进去。 - Regular Jo
哎呀,说得对。我没有声望了,所以它不让我在一些地方进行编辑/评论之类的操作。现在已经完成了。 - user6767685

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接