c++ - 如何增加fps opencv多相机设置

标签 c++ opencv

我有一个 OpenCV 程序可以尽可能快地同时从 2 个摄像头抓取图像。为了让两个相机拍摄的图像尽可能接近,我使用了 grab() 和 retrieve() 函数。我现在获得的帧速率非常慢(大约 6 fps)。我想增加这个fps。有谁知道如何提高 fps?

我在想也许可以将每个相机放在不同的线程上或以某种方式利用多线程,但我担心它们不会以这种方式同时捕获图像。

void takeImages(VideoCapture& cap, VideoCapture& cap1, int imagecount){


    if(!cap.isOpened()|| !cap1.isOpened()) {  // check if we succeeded
        cout << "Can not open cameras." << endl;
        return;
    }


    Mat frame, frame2;
    for(int x = 0;x < imagecount; x++)
    {
        // Capture image from both camera at the same time (important).
        if( !cap.grab() || !cap1.grab() )
        {

            cout << "Can not grab images." << endl;
            return;
        }


        if( cap.retrieve(frame,3) || cap1.retrieve(frame,3)){

            //process images here..

        } else {
            cout << "Can not retrieve images." << endl;
            return;
        }

        printf("x = %d\n", x);
    }

    waitKey(0);
}



int main(int, char**)
{

    // trying to set higher program priority to increase fps here
    cout << "Nice = " << nice(21) << endl;

    VideoCapture cap(0); // open the default camera
    VideoCapture cap1(1);


    namedWindow("cam1",1);
    namedWindow("cam2",1);

    std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
    //Get the time it takes to get 200 frames from BOTH cameras.
    takeImages(cap,cap1, 200);

    std::chrono::steady_clock::time_point end= std::chrono::steady_clock::now();
    std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::seconds>(end - begin).count() <<std::endl;

    return 0;
}

最佳答案

您应该能够通过将每个相机移动到其自己的线程来使您的 fps 加倍。要同步相机,您可以使用 std::chrono::steady_clock 确保它们同时捕捉。

也许是这样的:

#include <thread>

using steady_clock = std::chrono::steady_clock;

void takeImages(VideoCapture& cap, int imagecount,
    steady_clock::time_point next_frame, unsigned fps)
{
    assert(fps > 0);
    assert(fps <= 1000);

    Mat frame;
    for(int x = 0; x  < imagecount; x++)
    {
        // Capture image from both camera at the same time (important).
        std::this_thread::sleep_until(next_frame);
        next_frame += std::chrono::milliseconds(1000 / fps);

        if(!cap.grab())
            throw std::runtime_error("Can not grab image.");

        if(!cap.retrieve(frame, 3))
            throw std::runtime_error("Can not retrieve image.");

        // process image here

    }

    waitKey(0);
}

int main(int, char**)
{
    try
    {
        // trying to set higher program priority to increase fps here
        // cout << "Nice = " << nice(21) << endl;

        VideoCapture cap0(0); // open the default camera
        VideoCapture cap1(1 + CAP_V4L2);

        if(!cap0.isOpened() || !cap1.isOpened())
        {  // check if we succeeded
            cout << "Can not open cameras." << endl;
            return EXIT_FAILURE;
        }

//      namedWindow("cam1", WINDOW_AUTOSIZE);
//      namedWindow("cam2", WINDOW_AUTOSIZE);

        std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();

        // pass the same time point to both threads to synchronize their
        // frame start times
        steady_clock::time_point next_frame = steady_clock::now() + std::chrono::milliseconds(50);

        std::thread t1{takeImages, std::ref(cap0), 200, next_frame, 10};
        std::thread t2{takeImages, std::ref(cap1), 200, next_frame, 10};

        t1.join();
        t2.join();

        std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
        std::cout << "Time difference = "
            << std::chrono::duration_cast<std::chrono::seconds>(end - begin).count()
            << std::endl;
    }
    catch(std::exception const& e)
    {
        std::cerr << e.what() << '\n';
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

关于c++ - 如何增加fps opencv多相机设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44449338/

相关文章:

c++ - 体系结构 x86_64 : "std::__1::locale::use_facet(std::__1::locale::id&) const" 的 undefined symbol

c++ - C++11 中的 float 比较

c++ - vtables 和 this 指针

c++ - UI Widget 按顺序绘制

python - 为什么cv2.imwrite方法为mnist测试图像数据集写一个黑色正方形?

java - 调用 findChessboardCorners 时获取角的坐标

c++ - 如何定位指针错误?

c++ - OpenCV:如何设置像素的 alpha 透明度

python - 如何使用 opencv 和 python 删除圆的外部区域

OpenCV 中的 Python 线程问题