23

我正在尝试在 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,但我得到了一个 1080p 的 5fps 流,它对应于 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编解码器。

4

3 回答 3

14

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

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

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);
于 2016-06-10T07:31:48.590 回答
3

使用罗技 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);
于 2018-08-19T15:46:03.690 回答
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 会更好。

于 2013-04-18T22:56:13.783 回答