cvCaptureFromCAM(CV_CAP_ANY)返回NULL

时间:2014-02-07 18:47:46

标签: python c++ opencv

我有一段c ++代码:

#include <opencv/highgui.h>
#include <iostream>

int main()
{
    CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); //tried (0) too
    if(capture == NULL)
        std::cout<<"NULL"<<std::endl;

    return 0;
}

并使用以下方法编译它:

g++ main.cpp `pkg-config opencv --cflags` `pkg-config opencv --libs`

./a.out的结果是

NULL

我使用OpenCV 2.4.2和Ubuntu 12.04

但我确信我的网络摄像头很好,因为以下python代码工作正常。

import cv2
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
cv2.imshow('frame', frame) # it shows a correct image from the webcam
cv2.waitKey(0)

有谁知道为什么我无法在C ++代码中阅读我的网络摄像头?

更新

然后我将OpenCV升级到2.4.8并再次编译C ++代码。 输出仍为NULL,它显示一些错误消息:

VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
libv4l2: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl S_FMT
libv4l2: error setting pixformat: Device or resource busy
libv4l1: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT

NULL

3 个答案:

答案 0 :(得分:1)

我看到它说“设备/资源正忙” ...我认为您正在其他地方使用网络摄像头......例如。 skype等。否则尝试使用以下代码:

尝试使用(1)代替(0)

VideoCapture cap(1);

for(;;)
{
    Mat frame;
    cap >> frame;
    imshow("My webcam", frame);
}

上面的代码是针对C ++格式的,如果你想获得一个IplImage,你可以添加以下行来将mat格式的“frame”转换成IplImage *格式

IplImage* img = new IplImage(frame);
cvShowImage("IplImage format webcam", img);

答案 1 :(得分:0)

然后我重新启动系统并解决了问题。嗯......

答案 2 :(得分:0)

默认情况下,当您将相机连接到Linux系统时,称为“动作”的过程将使其保持占用状态。 你必须杀了它。以下命令将查找并终止“动作”。

  

sudo killall -9动议

执行此操作后,我猜你的代码会起作用。如果你设法解决它,请分享。 感谢