c++ - 计算的 fps 如何大于相机声明的 fps?

标签 c++ opencv camera frame-rate

我正在尝试在处理来自相机的帧时测量每秒帧数。计算没什么特别的,可以在这个问题中找到:How to write function with parameter which type is deduced with 'auto' word? 我的相机相当旧,制造商宣称 FPS 不超过 30,分辨率为 640x480。然而,当我运行这些计算时,它在直播中显示 40-50。怎么会这样?

更新:代码:

#include <chrono>
#include <iostream>

using std::cerr;
using std::cout;
using std::endl;

#include <string>
#include <numeric>

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/imgproc.hpp>

using cv::waitKey;
using cv::Mat;

using time_type = decltype(std::chrono::high_resolution_clock::now());

void showFPS(Mat* frame, const time_type &startTime);

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

    cv::VideoCapture capture;
    std::string videoDevicePath = "/dev/video0";

    if (!capture.open(videoDevicePath)) {
        std::cerr << "Unable to open video capture.";
        return 1;
    }
    //TODO normally through cmd or from cameraParameters.xml
    bool result;
    result = capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
    if (result) {
        std::cout << "Camera: PROP_FOURCC: MJPG option set.";
    } else {
        std::cerr << "Camera: PROP_FOURCC: MJPG option was not set.";
    }
    result = capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    if (result) {
        std::cout << "Camera: PROP_FRAME_WIDTH option set.";
    } else {
        std::cerr << "Camera: PROP_FRAME_WIDTH option was not set.";
    }
    result = capture.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
    if (result) {
        std::cout << "Camera: PROP_FRAME_HEIGHT option set.";
    } else {
        std::cerr << "Camera: PROP_FRAME_HEIGHT option was not set.";
    }
    result = capture.set(CV_CAP_PROP_FPS, 30);
    if (result) {
        std::cout << "Camera: PROP_FPS option set.";
    } else {
        std::cerr << "Camera: PROP_FPS option was not set.";
    }

    Mat frame, raw;
    while (cv::waitKey(5) != 'q') {
        auto start = std::chrono::high_resolution_clock::now();
        capture >> raw;

        if (raw.empty()) {
            return 1;
        }
        if (raw.channels() > 1) {
            cv::cvtColor(raw, frame, CV_BGR2GRAY);
        } else {
            frame = raw;
        }
        showFPS(&raw1, start);
    }
    return 0;
}

void showFPS(Mat* frame, const time_type &startTime) {
    typedef std::chrono::duration<float> fsec_t;

    auto stopTime = std::chrono::high_resolution_clock::now();
    fsec_t duration = stopTime - startTime;

    double sec = duration.count();
    double fps = (1.0 / sec);
    std::stringstream s;
    s << "FPS: " << fps;
    cv::putText(*frame, s.str(), Point2f(20, 20), constants::font,
                constants::fontScale, constants::color::green);
}

最佳答案

相机的 FPS 是相机每秒可以提供的帧数。 这意味着相机每 33ms 提供一次新帧。

另一方面,您测量的不是 FPS。 您正在测量新帧检索和颜色转换功能的反时间。 根据您的结果,这次时间为 20-25 毫秒。

这不是测量 FPS 的正确方法,至少因为您无法保证这两个进程的同步。

如果您想正确测量 FPS,您可以测量显示最后 N 帧的时间。

伪代码:

counter = 0;
start = getTime();
N = 100;

while (true) {
  captureFrame();
  convertColor();
  counter++;

  if (counter == N) {
    fps = N / (getTime() - start);
    printFPS(fps);

    counter = 0; 
    start = getTime();
  }
}

关于c++ - 计算的 fps 如何大于相机声明的 fps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54155867/

相关文章:

c++ - 使用文件系统 C++ 库创建文件

c++ - 最后一个列表元素的输出没有发生

Python OpenCV 未检测到明显的轮廓

ios - 通过浏览器访问相机

c++ - OpenCV 相机初始化失败

c++ - GPLv2 会阻止我在我的网站上使用 KLone 吗?

c++ - 在 Qt 中使用 QRubberBand 裁剪图像

python - ModuleNotFoundError : No module named 'cv2' in Spyder IDE, 即使在我的 windows pc 中使用 anaconda 成功安装了 opencv 库

opencv:垂直和水平方向的视频高度和宽度报告相同

android - onActivityResult 返回 Intent data.getData(); always Null Only in Marshmallow 和 Lollipop