我在尝试为树莓派使用运动检测器时,注意到了一些非常奇怪的事情:
从脚本中删除摄像头日志记录,使其几乎不使用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并且耗尽电池?
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