用openCV 2.4.3从罗技c920捕获1080p, 30fps



我正试图在OpenCV中捕获罗技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,但我得到一个1080p的5fps流,对应于YUY2流。
如果我添加以下行:

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

返回0。我得到一个30帧/秒的流,在640x480。对我来说,看起来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编解码器

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

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

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);

与罗技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);

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

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会更好地工作。

最新更新