【问题标题】:How to set camera fps in opencv?如何在opencv中设置相机fps?
【发布时间】:2017-04-24 02:12:47
【问题描述】:

我正在使用支持 1280 x 720 @ 60 fps 的网络摄像头。

我的电脑环境是intel i5-4690K和Windows7,Visual Studio 2015,opencv 3.1

当我在 Kinovea(0.85.15, https://www.kinovea.org/) 中运行网络摄像头时,摄像头以 1280 x 720 @ 60fps 运行。

但是,在带有 Opencv 的 Visual Studio 中,它在 60 fps 时不起作用。

它只能工作 12~15 fps。

我检查相机 fps 的代码如下。

#include <stack>
#include <iostream>
#include <math.h>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <opencv2/video.hpp>
#include "opencv2/imgcodecs.hpp"
#include <time.h>



using namespace cv;
using namespace std;


int keyboard;


int main(int argc, char** argv)
{

    VideoCapture cap(0); //capture the video from web cam

    if (!cap.isOpened())  // if not success, exit program
    {
        cout << "Cannot open the web cam" << endl;
        return -1;
    }
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

    while ((char)keyboard != 'q' && (char)keyboard != 27)

    {
        Mat imgOriginal;
        Mat ROOI;

        clock_t a = clock();
        bool bSuccess = cap.read(imgOriginal); 

        if (!bSuccess)
        {
            cout << "Cannot read a frame from video stream" << endl;
            break;
        }
        printf("Captue Time : %f\n", double(clock() - a) / double(CLOCKS_PER_SEC));

        imshow("Original", imgOriginal);

        if (waitKey(1) == 27) 
        {
            cout << "esc key is pressed by user" << endl;
            break;
        }
    }

    return 0;

}

在上面的代码中。我检查了“Capture Time”,通常记录0.07s~0.09s。

所以,我尝试 VideoCapture::set(CV_CAP_PROP_FPS, 60),但它不起作用。 (当我使用代码 VideoCapture::get(CV_CAP_PROP_FPS) 获取 FPS 时,它返回值 0。)

如何控制网络摄像头 FPS?

谢谢。

【问题讨论】:

  • 你看过这个帖子吗? (stackoverflow.com/questions/19662193/…) - 网络摄像头通常具有固定的帧速率,无法更改。
  • @Dai 谢谢你的回复。但是,如果网络摄像头具有固定的帧速率,我无法理解它如何在 Kinovea 程序中以 60 fps 运行。 Kinovaa 和 opencv 有什么不同?谢谢。
  • 很大程度上取决于相机是否支持各种输入电平。我可以举一个例子,OpenCV+OpenNI 如何允许设置 VideoeCapture(与 Kinect 一起使用):modeRes = m_capture.set(CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, X);,在这种情况下,X 是其中之一:{CAP_OPENNI_VGA_30HZ, CAP_OPENNI_SXGA_15HZ, CAP_OPENNI_SXGA_30HZ}。我想 OpenNI 会在分辨率设置中对其进行编码。
  • @hauron 感谢您的回复。我认为你的意见是尝试。我会试试的。谢谢!

标签: c++ opencv frame-rate


【解决方案1】:

您可以尝试在 OpenCV 之外设置相机的帧速率,例如在 Linux 上,您可以使用 libwebcam 尤其是 uvcdynctrl 控制 UVC 相机(Logitech 等)。

【讨论】:

  • 感谢您的回复。我想知道 libwebcam 和 uvcdynctrl 是否能够控制网络摄像头的 fps?现在,我在 Linux 中使用“Video4Linux 控制面板”。我可以通过 Video4Linux 控制亮度、曝光等,但它不支持控制网络摄像头的 fps。他们怎么样?谢谢。
  • 有些相机可能根本不支持不同的 fps 正如@Dai 在上面的评论中指出的那样。
  • 感谢您的回复。我遇到了相机支持 60 fps 的问题,但它在 opencv 中不能以 60 fps 工作。问题是相机连接方法。我的相机在 MJPG 上支持 60 fps。当我调试上面的代码时,相机在 YUY2 上工作。因此,我添加了如下代码。 'cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));' 'cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);'而且,它工作正常@ 60 fps。谢谢!
【解决方案2】:

当我像下面这样修改我的代码时,它以 60 fps 的速度工作。

#include <stack>
#include <iostream>
#include <math.h>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <opencv2/video.hpp>
#include "opencv2/imgcodecs.hpp"
#include <time.h>



using namespace cv;
using namespace std;


int keyboard;


int main(int argc, char** argv)
{

    VideoCapture cap(0); //capture the video from web cam

    if (!cap.isOpened())  // if not success, exit program
    {
        cout << "Cannot open the web cam" << endl;
        return -1;
    }
    cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720);

    while ((char)keyboard != 'q' && (char)keyboard != 27)

    {
        Mat imgOriginal;
        Mat ROOI;

        clock_t a = clock();
        bool bSuccess = cap.read(imgOriginal); 

        if (!bSuccess)
        {
            cout << "Cannot read a frame from video stream" << endl;
            break;
        }
        printf("Captue Time : %f\n", double(clock() - a) / double(CLOCKS_PER_SEC));

        imshow("Original", imgOriginal);

        if (waitKey(1) == 27) 
        {
            cout << "esc key is pressed by user" << endl;
            break;
        }
    }

    return 0;

}

相机在 60 fps 下工作的关键是

cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));

我的相机在 MJPG 模式下工作 @60 fps。所以我添加了上面的代码,它工作正常!

【讨论】:

  • 相机很可能需要切换到 M-JPEG 才能不达到 USB 2.0 限制或其他内容。请注意,这只是您的相机的解决方案,它不会帮助任何使用不同相机的人,即使该相机支持 60 FPS。此外,CV_CAP_PROP_FPS 有时 有效...
猜你喜欢
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-10
  • 2021-02-11
相关资源
最近更新 更多