【问题标题】:Getting BeagleBone to capture a still frame using OpenCV让 BeagleBone 使用 OpenCV 捕获静止帧
【发布时间】:2013-03-06 17:49:03
【问题描述】:

我有一个运行 Å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

这很有趣,因为 apparently CaptureFromCAM 使用 V4L 接口......我不知道从这里去哪里。

【问题讨论】:

  • 是否,相机响应。某些相机型号在拍摄图像时会闪烁其 LED 灯。你有没有尝试过类似的工作。还有,保存图片呢?
  • 啊,它没有响应......所以这是更多信息,但仍然不确定去哪里?我对 linux 还很陌生。

标签: linux opencv beagleboard angstrom-linux video4linux


【解决方案1】:

非常first thingyou 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 之间看到了奇怪的行为。如果以上方法都不能帮助您解决问题,我建议您编译一个 C 程序(具有最可靠的 API),使用 OpenCV 从相机中检索数据。在某些情况下,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;
}

【讨论】:

  • 你写的python代码和我经历的步骤是等价的,我返回的结果也是一样的。尝试编译您链接到的 C 代码(注意:我不知道任何 C)返回(注意,我将文件命名为 temp.c)...... temp.c:1:10: 错误:在 '*' 标记之前应有 '='、','、';'、'asm' 或 'attribute'
  • 抱歉,该代码缺少main() 函数。我在答案中添加了完整的应用程序。如果您还有其他编译问题,请告诉我。
【解决方案2】:

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

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

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

opkg update
opkg install kernel-module-uvcvideo
modprobe uvcvideo

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

【讨论】:

  • 我知道相机正在工作(至少在我的 windows 盒子上)。我按照您的指示安装了 uvcvideo 模块,但仍然无法正常工作...任何其他建议(与此同时,我仍在挖掘)
  • 那么在我运行modprobe uvcvideo之后我应该看到什么具体的东西吗?
  • 你一定会看到类似:视频采集接口:v2.00;注册新的接口驱动程序uvcvideo; Video Class driver (1.1.1) 这将确保驱动程序安装正确
  • 连接相机应该会在终端打印凸轮的型号详细信息。如果没有,请执行“dmesg”并查看最后几行是否显示类似:usb 1-2.1: Product: Webcam C110
  • 我们不要通过从头开始搜索问题来使事情复杂化。向我展示 'modprobe uvcvideo' 和 'dmesg' 的输出可能会给我们提供您的问题的线索。
【解决方案3】:
  1. 尝试使用任何 V4L2 应用程序并尝试在不使用任何代码的情况下测试相机。您可以下载 Qt V4L2 软件并使用它来测试相机。
  2. 如果第一步失败,则说明您的相机驱动程序有问题,并且不受支持。
  3. 如果第一步成功,请检查您的代码并尝试使用 gstreamer 或任何现成的 V4L2 捕获示例。

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

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 2014-06-03
    • 2012-05-21
    • 1970-01-01
    • 2021-11-26
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多