Не могу получить максимальные 30 кадров в секунду, которые поддерживает моя веб-камера с OpenCV и C ++ - PullRequest
2 голосов
/ 24 марта 2020

Я играю с OpenCV и двумя веб-камерами (Logitech C525, макс. 720p@30fps и TedGem 1080, макс. 1080p@30fps). Я хотел бы записать на диск эти 30 кадров в секунду, но я получаю только ~ 28 для Logitech и ~ 24 для TedGem.

Мой подход заключается в следующем: запустить поток, который читает кадры и записывает их на диск, ждать в течение 5 секунд, используя usleep, и поднимать флаг остановки. Теоретически я должен был записать ~ 150 кадров (30 кадров в секунду, 5 секунд), но я получаю только 140 для Logitech и 117 для TedGem. Это аппаратное ограничение или что-то не так с кодом? Можно ли сохранять необработанные изображения, а не сжатые в формате jpg, чтобы я мог сэкономить некоторое время?

Я пробовал также с отдельными потоками для записи и чтения и даже с разным разрешением, с одинаковыми результатами.

#include "opencv2/opencv.hpp"
#include "iostream"
#include "thread"
#include <unistd.h>

using namespace cv;

VideoCapture camera(0);
bool stop = false;
int fc = 0;

void saveFrames()
{
    while(!stop)
    {
        Mat frame;
        camera >> frame;
        // camera.read(frame); // same results with this one
        cv::imwrite("frames/frame" + std::to_string(fc) + ".jpg", frame);
        fc++;
    }
}

int main()
{
    if(!camera.isOpened())
        return -1;

    camera.set(CV_CAP_PROP_FRAME_WIDTH,1280);
    camera.set(CV_CAP_PROP_FRAME_HEIGHT,720);
    camera.set(CV_CAP_PROP_FPS,30);

    double fps = camera.get(CV_CAP_PROP_FPS);

    std::thread tr(saveFrames);
    usleep(5e6);
    stop = true;
    tr.join();
    std::cout << "Written " << fc << " frames of " << fps * 5 << std::endl;
    return 0;
}

Если вместо использования многопоточности я просто вызываю процедуру чтения 300 раз, чтобы получить 300 кадров, даже без вызова imwrite, и использую std :: chrono для подсчета времени, я получаю 10,35 секунды для 300 кадров (~ 28,91 к / с).

Дополнительные данные после дополнительного тестирования: я переключился на std :: chrono, чтобы измерить время с начала опроса до его окончания. Кажется, что нет заметного различия между многопоточной и непоточной версией или между версиями только для чтения и чтения и записи. Согласно хронографу, я почти достигаю 29 кадров в секунду с Logitech, но все еще 26,5 кадров в секунду с TedGem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...