Подтвердить что ты не робот

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

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

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

Это возвращает 0. Я получаю 30 fps поток на 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);
    }
}

EDIT2: Решение состоит в том, чтобы установить кодек fourCC перед установкой высоты и ширины камеры.

4b9b3361

Ответ 1

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

Вы должны установить кодек перед установкой требуемого разрешения:

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);

Ответ 2

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

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



//редактировать:
Yo может попытаться использовать другой API - см. Вторую часть моего ответа здесь: fooobar.com/info/275189/... OpenCV пытается использовать лучший API по умолчанию, но, возможно, в вашем случае некоторые другой API будет работать лучше.