Захват 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 кадров в секунду в 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 перед установкой высоты и ширины камеры.
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);
Для работы с 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);
Попробуйте получить первый кадр из захвата, прежде чем устанавливать что-либо:
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 - смотрите вторую часть моего ответа здесь: /questions/30662368/opencv-na-mac-ne-otkryivaet-veb-kameru-usb/30662372#30662372 OpenCV пытается использовать лучший API по умолчанию, но, возможно, в вашем случае будет работать какой-то другой API лучше.