让BeagleBone使用OpenCV捕获静止帧

时间:2013-03-06 17:49:04

标签: linux opencv beagleboard angstrom-linux video4linux

我有一个运行Ångström Linux 3.2.28的BeagleBone,我正试图从我的相机中捕捉一帧。

所以我插入了我的USB网络摄像头,然后检查/dev以确保它显示出来。

确实如video0(右下)。我知道这是正确的,因为它在我拔掉相机后就消失了。

 (bo

所以现在我启动Python并运行以下命令:

root@beaglebone:/dev# python
Python 2.7.2 (default, Sep 11 2012, 16:15:43)
[GCC 4.5.4 20120305 (prerelease)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
>>> capture=cv.CaptureFromCAM(-1)
>>> img=cv.QueryFrame(capture)
>>> type(capture)
<type 'cv2.Capture'>
>>> type(img)
<type 'NoneType'>

如您所见,我能够充分创建捕获对象,但我无法从中拉出帧。我也用相机ID(上面代码中的-1)的不同(或没有)整数参数尝试了这个,但没有用。

作为参考,在IPython的笔记本电脑上运行相同的代码如下所示:

In [1]: import cv
In [2]: capture=cv.CaptureFromCAM(-1)
In [3]: img=cv.QueryFrame(capture)
In [4]: type(capture)
Out[4]: cv2.Capture
In [5]: type(img)
Out[5]: cv2.cv.iplimage

你可以看到我在这里拍摄的是一张照片。我不确定从这里到底要去哪里。

更新:

我使用FFmpeg玩了一下,并且能够通过发出以下命令让相机响应(也就是说,它继续亮起):

root@beaglebone:/# ffmpeg -f video4linux2 -i /dev/video0

这很有趣,因为apparently CaptureFromCAM使用了V4L界面...我不知道从哪里开始。

3 个答案:

答案 0 :(得分:2)

非常first thing you need to do 确保CaptureFromCAM()成功

import cv
capture = cv.CaptureFromCAM(-1)
if not capture:
    print "Unable to open device #-1"
    sys.exit(1) 

发送-1作为参数告诉OpenCV打开默认的摄像头设备。在某些系统上,这不起作用,您需要增加数量。尝试传递0,然后1以及2

您需要做的第二件事是确保QueryFrame()返回有效的内容:

img = cv.QueryFrame(capture)
if not img:
    print "Unable to retrieve frame from the device"
    sys.exit(1) 

我在OpenCV的Python API和C(甚至是C ++)API之间看到过奇怪的行为。如果以上都不能帮助您解决问题,我建议您使用OpenCV 编译C程序(具有最可靠的API)从相机中检索数据。在某些情况下,OpenCV的C API工作和Python不工作。

This C program从相机中检索帧并将其显示在窗口中:

#include <stdio.h>
#include <highgui.h>
#include <cv.h>

int main() 
{
CvCapture* capture = NULL;
if ((capture = cvCaptureFromCAM(-1)) == NULL)
{
    fprintf(stderr, "ERROR: capture is NULL \n"); 
    return -1;
}

cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE);

cvQueryFrame(capture); // Sometimes needed to get correct data

while (1) 
{     
    IplImage* frame = cvQueryFrame(capture); // check return
    {
        fprintf( stderr, "ERROR: cvQueryFrame failed\n");
        break;
    }

    // At this point you already have the frame! There's no need to
    // repeat the thing 10x with cvGrabFrame and cvRetrieveFrame. 
    // You are probably sabotaging yourself doing this multiple times.

    cvShowImage("mywindow", frame); // Do not release the frame!

    int key = cvWaitKey(10);
    if (key  == 0x1b)
        break;
}    

cvReleaseCapture(&capture);   
cvDestroyWindow("mywindow");   

return 0;
}

答案 1 :(得分:1)

我不确定这是否可以作为答案。请尝试以下方法。

我想,不支持相机驱动程序。将相机连接到电路板上并在终端中键入“dmesg”,然后查看是否在其中检测到相机制造商名称。

如果消息中没有任何制造商名称,则应从终端安装摄像头驱动程序:

opkg update
opkg install kernel-module-uvcvideo
modprobe uvcvideo

如果上述步骤对您没有帮助,请尝试安装VLC media player或支持从相机输入视频的任何其他播放器,并尝试它是否正常工作。 :)

答案 2 :(得分:0)

  1. 尝试使用任何V4L2应用程序并尝试在不使用任何代码的情况下测试相机。有Qt V4L2软件,您可以下载并测试相机。
  2. 如果第一步失败,则说明您的相机驱动程序存在问题,并且不支持。
  3. 如果第一步成功,请检查您的代码并尝试使用gstreamer或任何现成的V4L2捕获样本。
  4. 我遇到了可以识别摄像头的问题,但是驱动程序有错误,因此请先检查内核是否真的支持摄像头的驱动程序。提及你的相机型号也很好。它是什么类型的接口MIPI或USB?我怀疑这是一个司机问题。