2016-12-08 5 views
1

Я использую веб-камеру с поддержкой 1280 x 720 при 60 кадров в секунду.Как установить fps камеры в opencv?

Мой компьютер окружение Intel i5-4690K и Windows7, Visual Studio 2015, OpenCV 3,1

При запуске веб-камеры в Kinovea (0.85.15, https://www.kinovea.org/), камера запуска в 1280 х 720 @ 60fps ,

Но, в Visual studio с Opencv, это не работает @ 60 кадров в секунду.

Он просто работает только 12 ~ 15 fps.

Мой код для проверки камеры fps приведен ниже.

#include <stack> 
#include <iostream> 
#include <math.h> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/videoio.hpp" 
#include <opencv2/video.hpp> 
#include "opencv2/imgcodecs.hpp" 
#include <time.h> 



using namespace cv; 
using namespace std; 


int keyboard; 


int main(int argc, char** argv) 
{ 

    VideoCapture cap(0); //capture the video from web cam 

    if (!cap.isOpened()) // if not success, exit program 
    { 
     cout << "Cannot open the web cam" << endl; 
     return -1; 
    } 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720); 

    while ((char)keyboard != 'q' && (char)keyboard != 27) 

    { 
     Mat imgOriginal; 
     Mat ROOI; 

     clock_t a = clock(); 
     bool bSuccess = cap.read(imgOriginal); 

     if (!bSuccess) 
     { 
      cout << "Cannot read a frame from video stream" << endl; 
      break; 
     } 
     printf("Captue Time : %f\n", double(clock() - a)/double(CLOCKS_PER_SEC)); 

     imshow("Original", imgOriginal); 

     if (waitKey(1) == 27) 
     { 
      cout << "esc key is pressed by user" << endl; 
      break; 
     } 
    } 

    return 0; 

} 

В приведенном выше коде. Я проверяю «Время захвата», и обычно это записи 0,07 с ~ 0,09 с.

Итак, я пытаюсь выполнить VideoCapture :: set (CV_CAP_PROP_FPS, 60), но это не работает. (Когда я получаю FPS, используя код VideoCapture :: get (CV_CAP_PROP_FPS), он возвращает значение 0.)

Как я могу управлять веб-камерой FPS?

Спасибо.

+0

Вы видели эту тему? (http://stackoverflow.com/questions/19662193/opencv-videocapturegetcv-cap-prop-fps-returns-0-fps) - веб-камеры обычно имеют фиксированную частоту кадров, которая не может быть изменена. – Dai

+0

@ Дай Спасибо за ваш ответ. Но я не могу понять, как работает 60 кадров в секунду в программе Kinovea, если веб-камеры имеют фиксированную частоту кадров. В чем разница между Kinovea и opencv? Благодарю. –

+0

Сильно зависит от того, поддерживает ли камера различные уровни ввода. Я могу привести пример использования OpenCV + OpenNI для установки VideeCapture (работа с Kinect): 'modeRes = m_capture.set (CAP_OPENNI_IMAGE_GENERATOR_OUTPUT_MODE, X);', где 'X' в этом случае является одним из:' {CAP_OPENNI_VGA_30HZ, CAP_OPENNI_SXGA_15HZ , CAP_OPENNI_SXGA_30HZ} '. Я полагаю, OpenNI кодирует его в пределах разрешения. – hauron

ответ

0

Вы можете попробовать установить частоту кадров камеры вне OpenCV, например. на Linux вы можете управлять камерами UVC (Logitech и т. д.), используя, в частности, libwebcam и uvcdynctrl.

+0

Спасибо за ответ. Интересно, что libwebcam и uvcdynctrl могут управлять fps веб-камер? Теперь я использую «Панель управления Video4Linux» в Linux. Я могу контролировать яркость, экспозицию и т. Д. По сравнению с Video4Linux, но это не поддержка fps веб-камеры поддержки. Как они? Благодарю. –

+0

Некоторые камеры могут просто не поддерживать разные fps. Как @Dai указал в комментарии выше. – szym

+0

Спасибо за ваш ответ. И у меня возникла проблема в том, что камера поддерживает 60 кадров в секунду, но не работает 60 кадров в секунду в opencv. Проблема заключается в способе подключения камеры. Моя камера поддерживает 60 кадров в секунду по MJPG. Когда я отлаживаю код выше, камера работает над YUY2. Итак, я добавляю код, как показано ниже. 'cap.set (CV_CAP_PROP_FOURCC, CV_FOURCC (' M ',' J ',' P ',' G '));' 'cap.set (CV_CAP_PROP_FRAME_WIDTH, 1280);' И он отлично работает на 60 кадров в секунду. Благодаря! –

0

Когда я изменяю свой код, как показано ниже, он работает на скорости 60 кадров в секунду.

#include <stack> 
#include <iostream> 
#include <math.h> 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/videoio.hpp" 
#include <opencv2/video.hpp> 
#include "opencv2/imgcodecs.hpp" 
#include <time.h> 



using namespace cv; 
using namespace std; 


int keyboard; 


int main(int argc, char** argv) 
{ 

    VideoCapture cap(0); //capture the video from web cam 

    if (!cap.isOpened()) // if not success, exit program 
    { 
     cout << "Cannot open the web cam" << endl; 
     return -1; 
    } 
    cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G')); 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1280); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 720); 

    while ((char)keyboard != 'q' && (char)keyboard != 27) 

    { 
     Mat imgOriginal; 
     Mat ROOI; 

     clock_t a = clock(); 
     bool bSuccess = cap.read(imgOriginal); 

     if (!bSuccess) 
     { 
      cout << "Cannot read a frame from video stream" << endl; 
      break; 
     } 
     printf("Captue Time : %f\n", double(clock() - a)/double(CLOCKS_PER_SEC)); 

     imshow("Original", imgOriginal); 

     if (waitKey(1) == 27) 
     { 
      cout << "esc key is pressed by user" << endl; 
      break; 
     } 
    } 

    return 0; 

} 

Ключ для камеры рабочего @ 60 кадров в секунду

cap.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G')); 

Моя камера работает @ 60 кадров в секунду в режиме MJPG. Поэтому я добавляю код выше, он отлично работает!

+0

Скорее всего, камера должна переключиться на M-JPEG, чтобы не попасть в пределы USB 2.0 или что-то в этом роде. Обратите внимание, что это только решение для вашей камеры, это не поможет никому другому, даже если эта камера поддерживает 60 FPS. Кроме того, работает 'CV_CAP_PROP_FPS'_sometimes_ ... –