已启用OpenMP的已编译OpenCV,但应用程序仍在一个核心上运行

时间:2015-09-26 21:45:28

标签: python opencv raspberry-pi openmp opencv3.0

我注意到使用PythonOpenCV脚本仅使用并最大化了我的一个cpu核心。我想充分发挥我的cpu的潜力,而不仅仅是1/4。在我研究过的时候,我发现OpenCV默认只使用1个核心,而且为了启用多线程,我所要做的就是在OpenMPWITH_OPENMP=ON)启用时编译库。所以这就是我所做的,但是在运行我的简单脚本时,我发现它仍然只使用一个核心,大大限制了我的应用程序的性能。

我还需要做些什么(也许修改我的代码)才能使用我Raspberry Pi的所有四个核心?

如果没有,安装过程可能出现问题?我第一次安装OpenCV时,OpenMP未启用。然后在使用OpenCV重新编译OpenMP后,我所做的只是sudo make installsudo 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()

1 个答案:

答案 0 :(得分:2)

请注意,对于这两点中的每一点,我可能都错了,因为我问题的评论部分中的@Jason能够在所有四个核心上运行我的脚本(甚至没有使用TBB或OpenMP进行编译,很奇怪。

因此,我现在发现使用所有四个核心的唯一解决方案是手动线程化我的代码。如果我找到了自动解决方案(这是OpenCV内部实现的解决方案),我将更新此答案。

如果您有兴趣使用OpenCV构建TBB,可以这样做:

$ 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中的解决方案效果非常好。享受!