我注意到使用Python的OpenCV脚本仅使用并最大化了我的一个cpu核心。我想充分发挥我的cpu的潜力,而不仅仅是1/4。在我研究过的时候,我发现OpenCV默认只使用1个核心,而且为了启用多线程,我所要做的就是在OpenMP(WITH_OPENMP=ON
)启用时编译库。所以这就是我所做的,但是在运行我的简单脚本时,我发现它仍然只使用一个核心,大大限制了我的应用程序的性能。
我还需要做些什么(也许修改我的代码)才能使用我Raspberry Pi的所有四个核心?
如果没有,安装过程可能出现问题?我第一次安装OpenCV时,OpenMP未启用。然后在使用OpenCV重新编译OpenMP后,我所做的只是sudo make install
和sudo ldconfig
。我没有卸载之前的OpenCV,猜测安装新OpenCV OpenMP会覆盖它。
赞赏任何见解!!
干杯
修改
我的脚本的目标是从网络摄像头捕获帧并同时将它们写在SD卡上。
import numpy as np
import cv2
import time
CV_CAP_PROP_FPS = 5 #https://github.com/Itseez/opencv/blob/e3ae36dcb3c1d523802f8642e5c3984db43637c4/modules/python/src2/defs
startTime = time.time()
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.div', fourcc, cap.get(CV_CAP_PROP_FPS), (640, 480))
nbOfFrames = 1
try:
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
out.write(frame)
print(time.time() - startTime)
print(nbOfFrames)
nbOfFrames += 1
except KeyboardInterrupt:
cap.release()
out.release()
答案 0 :(得分:2)
read
和write
方法似乎也未在内部并行化,因此没有任何区别。请注意,对于这两点中的每一点,我可能都错了,因为我问题的评论部分中的@Jason能够在所有四个核心上运行我的脚本(甚至没有使用TBB或OpenMP进行编译,很奇怪。
因此,我现在发现使用所有四个核心的唯一解决方案是手动线程化我的代码。如果我找到了自动解决方案(这是OpenCV内部实现的解决方案),我将更新此答案。
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON \
-D BUILD_TBB=ON \
-D WITH_TBB=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..
在为TBB 3.0编译OpenCV时遇到错误,但此GitHub ticket中的解决方案效果非常好。享受!