2013-07-10 3 views
0

Пожалуйста, ознакомьтесь со следующим кодом.Запись видео слишком быстро

#include <iostream> 
#include <opencv2/core/core.hpp> 
#include <string> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/video/background_segm.hpp> 

using namespace std; 
using namespace cv; 

double getMSE(const Mat& I1, const Mat& I2); 

int main() 
{ 
    Mat current; 
    VideoCapture cam1; 
    VideoWriter *writer = new VideoWriter(); 



    cam1.open(0); 

    namedWindow("Normal"); 

    if(!cam1.isOpened()) 
    { 
     cout << "Cam not found" << endl; 
     return -1; 
    } 

    cam1>>current; 
    Size *s = new Size((int)current.cols,current.rows); 
    writer->open("D:/OpenCV Final Year/OpenCV Video/MyVideo.avi",CV_FOURCC('D','I','V','X'),10,*s,true); 


    while(true) 
    { 
     //Take the input 
     cam1 >> current; 

     *writer << current; 
     imshow("Normal",current); 

     if(waitKey(30)>=0) 
     { 
       break; 
     } 


    } 
} 

Этот код работает нормально, никаких проблем. Но, когда я запускаю записанное видео, это супер быстро! Как быстро пересылается. Я действительно не понимаю, почему. Пожалуйста помоги.

+0

Таким образом, некоторые кадры при сохранении опущены? –

+2

Что такое «запуск» FPS? Если это 24, и вы сохраняете с 10, то он быстро пересылается множителем 2.4. –

+0

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

ответ

1

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

Частота кадров для записи в файл определяется как fps аргумент this function:

bool VideoWriter::open(const string& filename, int fourcc, 
      double fps, Size frameSize, bool isColor=true); 

Что касается кадров камеры, для некоторых камер можно определить частоту кадров as follows

double fps = cam1.get(CV_CAP_PROP_FPS); 

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

Обновление: Если камера не поддерживает cam1.get(CV_CAP_PROP_FPS);, тогда частота кадров оценивается экспериментально. Как это, например:

while(true) { 
    int64 start = cv::getTickCount(); 

    //Grab a frame 
    cam1 >> current; 

    if(waitKey(3)>=0) { 
     break; 
    } 

    double fps = cv::getTickFrequency()/(cv::getTickCount() - start); 
    std::cout << "FPS : " << fps << std::endl; 
} 

Кроме того, убедитесь, что выход видео файл открыт для записи

if (!writer->isOpened()) 
{ 
    cout << "Could not open the output video for write: " << endl; 
    return -1; 
} 
+0

CV_CAP_PROP_FPS возвращено 0 !!!! –

+0

Возможно, ваша камера не поддерживает этот метод. Вы оцениваете частоту кадров камеры, измеряя среднюю частоту кадров экспериментально. Например, используя команды OpenCV, такие как 'cv :: getTickCount();' и 'cv :: getTickFrequency()' – Alexey

+0

значение 7,8 и 9 –

Смежные вопросы