在30fps的罗技C920捕获与1080 OpenCV的2.4.3(Capturing 1080p

2019-08-31 12:33发布

我试图捕获视频流过我的罗技C920中的OpenCV。 使用LabVIEW,我可以以30fps的1080p访问MJPG流。 在OpenCV中本人水平有限要么5fps的或640×480。

下面是相机设置相关的代码:

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,但我得到1080的5fps的流对应于YUY2流。
如果我添加下面一行:

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

这将返回0。我在640×480弄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:溶液是设置相机的高度和宽度之前设置四字符码编解码器。

Answer 1:

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

您必须设置想要的分辨率之前设置的编解码器:

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


Answer 2:

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


Answer 3:

试图从捕捉第一帧设置任何东西之前:

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



文章来源: Capturing 1080p at 30fps from logitech c920 with openCV 2.4.3