2014-12-18 2 views
1

Мне нужно взять один кадр для второго с OpenCV. Проблема заключается в том, что VideoCapture :: get (CV_CAP_PROP_FPS); всегда возвращает 0. И если я попытаюсь установить желаемые fps с помощью VideoCapture :: set ничего не изменится.Как захватить видео с OpenCV в C++ с нужным fps

Это мой код:

VideoCapture cap(0); 

if (!cap.isOpened()) { 
    cout << "Cannot open the video cam" << endl; 
    return -1; 
} 

double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); 
double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); 
double fps = 1; 
cap.set(CV_CAP_PROP_FPS, fps); 
cout << "FPS : " << fps << endl; 

cout << "Frame size : " << dWidth << " x " << dHeight << endl; 


namedWindow("CAPTURE EXPRESSION",CV_WINDOW_AUTOSIZE);  
while (1) { 
    Mat frame; 

    bool bSuccess = cap.read(frame); 

    if (!bSuccess) { 
     cout << "Cannot read a frame from video stream" << endl; 
     break; 
    } 
    fps = cap.get(CV_CAP_PROP_FPS); 
    imshow("MyVideo", frame); 
    cout << "FPS : " << fps << endl; 

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

P.S. я использую OpenCV 2.4.9 с Mac OS и со встроенной камерой MacBook

+0

поток веб-камеры от VideoCapture не имеет fps. (вы не можете ни установить, ни получить). все, что вы можете сделать, это измерить время самостоятельно и установить тайм-аут в waitKey() – berak

+0

и с внешней камерой? – luke88

+0

^^ нет, такой же проблема. просто используйте waitKey (1000); и вы получите около 1fps. – berak

ответ

1

Этот набор и получить из кадров всегда беспорядок, даже когда я в след, они являются своего рода случайным образом, правильное объяснение от кому-то было бы интересно почитать. Он может иметь некоторые зависимости от видеоконтейнера.

Но, я не думаю, что установленные параметры fps применимы для живой камеры, как будто просят мир перед веб-камерой работать медленно, чего не произойдет. Другой способ хранения живых кадров в буфере и отображения в соответствии с вашей необходимой скоростью. Я не думаю, что opencv сделает это. Итак, если вы хотите более медленную скорость, запишите видео, а затем установите fps и проверьте записанное видео.

И waitKey, с большим числом, в случае живого потока, пропускает промежутки между интервалами, поэтому используйте его только, если вы думаете, это вам поможет.

2

Вы не можете установить частоту кадров для каналов камеры, поскольку они просто подключаются к сети, когда они запрашиваются вашим кодом. Вы можете поместить задержку в свой код, чтобы запрашивать их только каждые 1 с, которые, я думаю, будут полезны для вашего варианта использования.

См. Ниже код.

Крышка видеокамеры (0);

в то время как (1) {

Mat frame; 

bool bSuccess = cap.read(frame); 

imshow("MyVideo", frame); 
//This Sets the Frame Rate to 1000ms (1s) 
cv::waitKey(1000); 

}