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

Dan*_*die 21 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'));
Run Code Online (Sandbox Code Playgroud)

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

this->camRef.set(CV_CAP_PROP_FPS, 30);
Run Code Online (Sandbox Code Playgroud)

返回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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

ns1*_*291 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);
Run Code Online (Sandbox Code Playgroud)


cyr*_*iel 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
Run Code Online (Sandbox Code Playgroud)

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

对我来说,在设置任何内容之前必须先获取第一帧有点奇怪,但这是它对我有用的唯一方法(Windows 7 32位)。



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