【问题标题】:Capturing 1080p at 30fps from logitech c920 with openCV 2.4.3使用 openCV 2.4.3 从罗技 c920 以 30fps 捕获 1080p
【发布时间】:2013-04-12 03:34:58
【问题描述】:

我正在尝试在 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编解码器。

【问题讨论】:

  • 如果你想设置fps(必须相机支持),你必须在编解码器设置之后,但在宽度/高度设置之前进行
  • 听起来您的 EDIT2 以 30fps 的速度为您提供了 1080p。应该变成答案并被接受,以使问题看起来已解决。

标签: opencv logitech


【解决方案1】:

需要使用罗技 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】:

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

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

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

    【讨论】:

    • 谢谢!它按说明工作!另一方面,我想提一下,虽然这将允许fullHD@30分辨率,但图像质量可能很差(压缩率必须很高才能满足USB 2.0的带宽限制)
    【解决方案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 可能会更好。

    【讨论】:

    • 感谢您的回复。我尝试了你所说的,现在我的代码在显示图像之前崩溃了。 cap.read 返回 1,然后在尝试再次从相机读取时崩溃。
    • 我已更新原始问题以显示您请求的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多