Opencv播放视频的问题

bool  ImageViewer::ShowImage()
{
   
double fps, start, end;
   
int count;
   
uchar *data;
   
IplImage *pImage = NULL;
   
CvCapture *pCapture = NULL;
  
if((pCapture = cvCaptureFromAVI("Alizee.avi")) == NULL){
      
cout << "Open video file failed! ";
      
return false;
   
}

   
while((pImage = cvQueryFrame(pCapture)) != NULL){
      
start = (double)cvGetTickCount();
      
fps = cvGetCaptureProperty(pCapture, CV_CAP_PROP_FPS);
      
image = IplImageToQImage(pImage, &data);
      
update();
      
if(cvWaitKey(1>= 0)
         
break;
      
free(data);
      
end = (double)cvGetTickCount();
      
count = (int)(1000000/fps-(end-start)/((double)(cvGetTickFrequency())));
      
if(count < 0)
         
count = 0;
      
usleep(count);
  
}

   
cvReleaseImage(&pImage);
   
cvReleaseCapture(&pCapture);
   
return true;
}

首先,cvGetCaptureProperty()对摄像头的操作无效,开始我也以为它对视频文件的操作也一样无效,结果是先用 cvQueryFrame()获取一帧后,再使用该函数才能获得视频文件的各种属性(帧的高度,宽度,总帧数,帧率等),本以为获得了视频文件的帧率,就可以解决视频播放速度快的问题,结果新的问题也产生了。

上述程序11~24行完成的是:从视频文件抓取一帧,然后把IplImage*类型的图像转成QImage*类型的图像,完成之后update(),执行一个paintEvent()事件,将转为QImage*的图像显示到Qt界面中。以下假定得到的视频帧率是25fps,这样的话就要保证循环的间隔时间是40ms,因此算出12~19行的执行时间time,然后usleep(40ms-time)时间,那么循环的时间间隔就是40ms了(20~22行的时间忽略不计)。试验的结果是播放速度没有以前那么快了,但是和正常速度相比还是不匹配。结果发现是usleep()延迟的时间不准,和参数值相差5~6ms,那么每8帧就会和正常速度错开一帧,1s内就会错开约3帧,结果因为usleep()延时不准带来了播放速度的变慢。

不知道有什么比较好的解决办法?(Opencv擅长图像处理,而对于视频播放的控制还不完善)

你可能感兴趣的:(image,null,qt,图像处理)