Захват 1080p со скоростью 30 кадров в секунду с logitech c920 с помощью openCV 2.4.3

Я пытаюсь захватить видеопоток с моего Logitech C920 в OpenCV. С Labview я могу получить доступ к потоку MJPG со скоростью 30 кадров в секунду 1080p. В opencv я ограничен либо 5 кадрами в секунду, либо 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 со скоростью 5 кадров в секунду, что соответствует потоку YUY2.
Если я добавлю следующую строку:

this->camRef.set(CV_CAP_PROP_FPS, 30);

Это возвращает 0. Я получаю поток 30 кадров в секунду при разрешении 640x480. Мне кажется, что настройка 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);
    }
}

РЕДАКТИРОВАТЬ 2: Решение состоит в том, чтобы установить кодек FourCC перед настройкой высоты и ширины камеры.


person Daniel Moodie    schedule 18.04.2013    source источник
comment
если вы хотите установить fps (должно поддерживаться камерой), вы должны сделать это после настройки кодека, но перед настройками ширины/высоты   -  person MartinM    schedule 02.04.2014
comment
Похоже, ваш EDIT2 дал вам 1080p со скоростью 30 кадров в секунду. Следует превратить в ответ и принять, чтобы проблема казалась решенной.   -  person Ulrich Stern    schedule 04.05.2016


Ответы (3)


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

Вы должны установить кодек, прежде чем установить желаемое разрешение:

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);
person Community    schedule 10.06.2016
comment
Спасибо! Сработало как заявлено! С другой стороны, я хотел бы упомянуть, что, хотя это позволит использовать разрешение fullHD@30, качество изображения может быть очень низким (степень сжатия должна быть высокой, чтобы соответствовать ограничениям полосы пропускания USB 2.0). - person cbuchart; 14.05.2017

для работы с logitech 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);
person Nate B    schedule 19.08.2018

Попробуйте получить первый кадр из захвата, прежде чем что-либо настраивать:

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 32bit).



//изменить:
Вы можете попробовать использовать другой API – см. вторую часть моего ответа здесь: https://stackoverflow.com/a/14188280/1598485 OpenCV по умолчанию пытается использовать лучший API, но, возможно, в вашем случае какой-то другой API будет работать лучше.

person cyriel    schedule 18.04.2013
comment
Спасибо за ответ. Я попробовал то, что вы сказали, и теперь мой код дает сбой перед отображением изображения. cap.read возвращает 1, а затем происходит сбой при повторной попытке чтения с камеры. - person Daniel Moodie; 19.04.2013
comment
Я обновил исходный вопрос, чтобы показать запрошенный вами код. - person Daniel Moodie; 19.04.2013