让BeagleBone使用OpenCV捕获静止帧

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

所以我插入我的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'> 

正如你所看到的,我能够充分地创build捕捉对象,但是我无法从中拉出一个框架。 我也尝试过使用不同的(或没有)整数参数的摄像头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接口…我不知道从哪里去。

你需要做的 第一件事是确保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; } 

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

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

如果制造商名称不在消息的任何位置,则应从终端安装相机驱动程序:

 opkg update opkg install kernel-module-uvcvideo modprobe uvcvideo 

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

  1. 尝试使用任何V4L2应用程序,并尝试测试相机,而不使用任何代码。 有Qt V4L2软件,你可以下载和测试相机。
  2. 如果第一步失败,那么相机驱动程序出现问题,不支持。
  3. 如果第一步成功,然后检查您的代码,并尝试使用gstreamer或任何现成的V4L2捕获样本。

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