4

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

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

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

(博

所以现在我启动 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

这很有趣,因为显然 CaptureFromCAM使用了 V4L 界面……我不知道从这里去哪里。

4

3 回答 3

2

您需要做第一件事确保成功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 不能。

这个 C 程序从相机中检索帧并将它们显示在一个窗口中:

#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;
}
于 2013-03-15T18:15:26.910 回答
1

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

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

如果消息中的任何位置都没有制造商名称,则将从终端安装相机驱动程序:

opkg update
opkg install kernel-module-uvcvideo
modprobe uvcvideo

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

于 2013-03-11T06:42:26.423 回答
0
  1. 尝试使用任何 V4L2 应用程序并尝试在不使用任何代码的情况下测试相机。有 Qt V4L2 软件,您可以下载和测试相机。
  2. 如果第一步失败,那么您的相机驱动程序有问题,并且不受支持。
  3. 如果第一步成功,请检查您的代码并尝试使用 gstreamer 或任何现成的 V4L2 捕获示例。

我遇到了可以识别相机的问题,但是驱动程序有错误,所以首先检查相机的驱动程序是否真的被您的内核支持。提及您的相机型号也很好。它是什么样的接口,MIPI还是 USB?我怀疑这是驱动程序的问题。

于 2013-03-17T23:47:44.910 回答