我有一个运行Å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界面...我不知道从哪里开始。
答案 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)
我遇到了可以识别摄像头的问题,但是驱动程序有错误,因此请先检查内核是否真的支持摄像头的驱动程序。提及你的相机型号也很好。它是什么类型的接口MIPI或USB?我怀疑这是一个司机问题。