使用openCV 2.4.3从logitech c920以30fps捕获1080p

时间:2013-04-18 20:49:20

标签: opencv logitech

我正在尝试从OpenCV中的Logitech C920中捕获视频流。使用Labview,我可以30fps 1080p访问MJPG流。在opencv中,我被限制为5fps或640x480。

以下是与相机设置相关的代码:

this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));

这些都返回1,但我得到一个5fps的1080p流,对应于YUY2流 如果我添加以下行:

this->camRef.set(CV_CAP_PROP_FPS, 30);

返回0。 我以640x480获得了30 fps的流。对我而言,似乎不接受MJPG设置,但我不知道该怎么做或如何解决这个问题。

编辑:以下内容导致程序崩溃。

 this->camRef.read(this->image);
 std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)                            << std::endl;
 std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width)         << std::endl;
 std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height)       << std::endl;
 std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl;
 std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)                            << std::endl;

然后在我的运行代码中,我有以下内容:

void camera::run()
{
    while(true)
    {
        if(this->camRef.read(this->image) == 0)
        {
           if(this->capture)
            {
                cv::imwrite(fileName,this->image);
                this->count++;
            }
        }
        msleep(15);
    }
}

EDIT2:解决方案是在设置相机高度和宽度之前设置fourCC编解码器。

3 个答案:

答案 0 :(得分:11)

由于帖子的作者已经找到了解决方案,但没有将其作为答案添加,我将把解决方案放在这里。

您必须在设置所需分辨率之前设置编解码器:

this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G'));
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);

答案 1 :(得分:2)

与Logitech c922合作,需要:

capture.open(CV_CAP_DSHOW);
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);

答案 2 :(得分:1)

在设置任何内容之前尝试从捕获中获取第一帧:

VideoCapture cap(0);
if(!cap.isOpened()) 
return -1;  

Mat frame;
cap >> frame;
double fps;
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0);
//add the loop here

并检查它是否可以在没有设置MJPG的情况下工作。如果它可行,请尝试使用MJPG。

对我而言,在设置任何内容之前必须获得第一帧是有点奇怪,但这是它为我工作的唯一方式(Windows 7 32位)。



//编辑:
哟可能会尝试使用不同的API - 请参阅我的答案的第二部分:https://stackoverflow.com/a/14188280/1598485 OpenCV默认情况下会尝试使用最好的API,但在您的情况下,其他一些API可能会更好用。