您的位置:首页 > 运维架构

Opencv播放视频的问题

2007-08-29 19:16 417 查看



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擅长图像处理,而对于视频播放的控制还不完善)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: