BeagleBone Black OpenCV Python太慢了

acs*_*acs 5 python opencv beagleboneblack

我尝试用opencv和python从网络摄像头获取图像.代码是如此基本:

import cv2
import time
cap=cv2.VideoCapture(0)
cap.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH,640)
cap.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT,480)
cap.set(cv2.cv.CV_CAP_PROP_FPS, 20)

a=30
t=time.time()
while (a>0):
        now=time.time()
        print now-t
        t=now
        ret,frame=cap.read()
        #Some processes
        print a,ret
        print frame.shape
        a=a-1
        k=cv2.waitKey(20)
        if k==27:
                break
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

但它运作缓慢.程序输出:

VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
HIGHGUI ERROR: V4L: Property <unknown property string>(5) not supported by device
8.82148742676e-06
select timeout
30 True
(480, 640, 3)
2.10035800934
select timeout
29 True
(480, 640, 3)
2.06729602814
select timeout
28 True
(480, 640, 3)
2.07144904137
select timeout
Run Code Online (Sandbox Code Playgroud)

组态:

  • Beaglebone Black RevC
  • Debian的wheezly
  • opencv 2.4
  • python 2.7

Aen*_*ed1 3

我在 Intel Edison 平台上使用 OpenCV 2.4.9 进行项目时遇到了类似的问题。在进行任何处理之前,仅执行帧抓取就需要大约 80 毫秒。事实证明,OpenCV 针对 Linux 的相机捕获逻辑似乎没有正确实现,至少在 2.4.9 版本中是这样。底层驱动程序仅使用一个缓冲区,因此不可能在应用程序层中使用多线程来解决这个问题 - 直到您尝试抓取下一帧,V4L2 驱动程序中的唯一缓冲区才会被锁定。

解决方案是不使用 OpenCV 的 VideoCapture 类。也许它被修复为在某个时候使用合理数量的缓冲区,但从 2.4.9 开始,情况并非如此。事实上,如果您查看@Nickil Maveli 提供的链接所写的同一作者的这篇文章,您会发现,一旦他提供了改进 Raspberry Pi 上 FPS 的建议,他就停止使用 OpenCV 的 VideoCapture。我不相信这是巧合。

这是我在英特尔爱迪生论坛上发表的有关它的帖子: https: //communities.intel.com/thread/58544

我基本上最终直接使用 V4L2 编写了自己的类来处理帧抓取。这样您就可以提供缓冲区的循环列表,并允许帧抓取和应用程序逻辑正确解耦。不过,对于 C++ 应用程序来说,这是用 C++ 完成的。假设上述链接兑现了其承诺,这可能是一个更容易的方法。我不确定它是否适用于 BeagleBone,但也许有类似于 PiCamera 的东西。祝你好运。

编辑:我查看了 OpenCV 2.4.11 的源代码。看起来他们现在默认使用 4 个缓冲区,但您必须使用 V4L2 才能利用这一点。如果仔细查看错误消息HIGHGUI ERROR: V4L: Property...,您会发现它引用的是 V4L,而不是 V4L2。这意味着您正在使用的 OpenCV 构建将依赖于旧的 V4L 驱动程序。除了导致性能问题的单一缓冲区之外,您还使用了一个古老的驱动程序,它本身可能有许多限制和性能问题。

最好的选择是自己构建 OpenCV 以确保它使用 V4L2。如果我没记错的话,OpenCV 配置过程会检查机器上是否安装了 V4L2 驱动程序并相应地进行构建,因此您需要确保用于构建 OpenCV 的机器上安装了 V4L2 和任何相关的开发包。