每2秒捕获一次帧

时间:2014-02-22 07:47:52

标签: c++ opencv image-processing frame-rate

我正在做一个关于视频人脸检测的项目。我从视频中检测到了脸部, 但它正在捕捉每一帧 ,所以我在第二帧中获得了这么多的图像(在一秒钟内拍摄了这么多帧) 。

问题:我想减少这一点,每3秒后捕获帧就足够了。我尝试使用wait()sleep()函数。但他们只是停止运行视频一段时间,没有其他事情发生。任何人都可以帮助我克服这一点。

    #include <cv.h>   
    #include <highgui.h>
    #include <time.h>
    #include <stdio.h>
    using namespace std;
    IplImage *frame;
    int frames;
    void facedetect(IplImage* image);
    void saveImage(IplImage *img,char *ex);
    IplImage* resizeImage(const IplImage *origImg, int newWidth,int newHeight, bool      keepAspectRatio);
    const char* cascade_name="haarcascade_frontalface_default.xml";//specify classifier     cascade.
    int k;
    int main(int argc, char** argv)
    {
      // OpenCV Capture object to grab frames
      //CvCapture *capture = cvCaptureFromCAM(0);
      CvCapture *capture=cvCaptureFromFile("video.flv");
      //int frames=cvSetCaptureProperty(capture,CV_CAP_PROP_FPS, 0.5);
      //double res1=cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES);
      //cout<<"res"<<res<<endl;
      // start and end times
       time_t start, end;
       // fps calculated using number of frames / seconds
       double fps;
      // frame counter
      int counter = 0;
      // start the clock
     time(&start);
     //while(cvGrabFrame(capture))
     while(1)
     {
    //if(capture.get(CV_CAP_PROP_POS_FRAMES) % 2 == 0)
    frames=cvSetCaptureProperty(capture,CV_CAP_PROP_FPS, 0.5);
    if(frames%2==0)
    {
    frame = cvQueryFrame(capture);
    cout<<"Frame"<<frame<<endl;
    facedetect(frame);
    }

     }

  cvReleaseCapture(&capture);
  return 0;
}

我捕获每一帧后都给了cvWaitKey(2000)。

3 个答案:

答案 0 :(得分:3)

这本来是我的审判。它每30帧保存一个图像。当你在一秒内说出太多图像时,我知道你指的是保存的面孔。

int counter = 0;
// start the clock
time(&start);
//while(cvGrabFrame(capture))
while(1)
{
  frame = cvQueryFrame(capture);
  cout<<"Frame"<<frame<<endl;
  if(count%30==0)
  {
   facedetect(frame);
  }
  count++;
}

如果你真的想跳过帧,那就试试吧。每秒一帧可能是下面代码的结果。

while(1)
{
 if(count%30==0)
  { 
   frame = cvQueryFrame(capture);
   cout<<"Frame"<<frame<<endl;
   facedetect(frame);
  }
  count++;
}

答案 1 :(得分:1)

每次捕获后,您都可以尝试拨打waitKey(2000)

请注意,该函数不会等待2000毫秒,它将等待至少2000毫秒,具体取决于当时计算机上还有其他内容。

要获得准确的帧速率,您可以通过以下方式设置捕获帧速率:

cap.set(CV_CAP_PROP_FPS, 0.5);

答案 2 :(得分:1)

我个人而言,我建议在当前帧上使用模运算符,例如%2 == 将检查每隔一帧。

if(capture.get(CV_CAP_PROP_POS_FRAMES) % 2 == 0)
    //your code to save

更改2到3或5可以定义偏移量。