用OpenCV播放视频
Playing a video in OpenCV
我是OpenCV的初学者,我希望在OpenCV中播放视频。我做了一个代码,但它只显示一个图像。我使用的是OpenCV 2.1和Visual Studio 2008。如果有人指引我哪里走错了,我会非常感激。下面是我粘贴的代码:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int main()
{
CvCapture* capture = cvCaptureFromAVI("C:/OpenCV2.1/samples/c/tree.avi");
IplImage* img = 0;
if(!cvGrabFrame(capture)){ // capture a frame
printf("Could not grab a framen7");
exit(0);}
cvQueryFrame(capture); // this call is necessary to get correct
// capture properties
int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
///numFrames=total number of frames
printf("Number of rows %dn",frameH);
printf("Number of columns %dn",frameW,"n");
printf("frames per second %dn",fps,"n");
printf("Number of frames %dn",numFrames,"n");
for(int i=0;i<numFrames;i++)
{
IplImage* img = 0;
img=cvRetrieveFrame(capture);
cvNamedWindow( "img" );
cvShowImage("img", img);
}
cvWaitKey(0);
cvDestroyWindow( "img" );
cvReleaseImage( &img );
cvReleaseCapture(&capture);
return 0;
}
您必须使用cvQueryFrame
而不是cvRetrieveFrame
。正如@Chipmunk指出的那样,你必须在cvShowImage
之后添加延迟。
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
cvNamedWindow( "img" );
for(int i=0;i<numFrames;i++)
{
IplImage* img = cvQueryFrame(capture);
cvShowImage("img", img);
cvWaitKey(10);
}
下面是使用OpenCV播放视频的完整方法:
int main()
{
CvCapture* capture = cvCreateFileCapture("C:/OpenCV2.1/samples/c/tree.avi");
IplImage* frame = NULL;
if(!capture)
{
printf("Video Not Openedn");
return -1;
}
int width = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
int height = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);
double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int frame_count = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("Video Size = %d x %dn",width,height);
printf("FPS = %fnTotal Frames = %dn",fps,frame_count);
while(1)
{
frame = cvQueryFrame(capture);
if(!frame)
{
printf("Capture Finishedn");
break;
}
cvShowImage("video",frame);
cvWaitKey(10);
}
cvReleaseCapture(&capture);
return 0;
}
在窗口上显示图像后,必须延迟或等待下一个图像才能显示,我想你可以猜到为什么会这样。对于延迟,我们用cvWaitKey()
。这就是我在循环代码中添加的内容。
cvNamedWindow( "img" );
for(int i=0;i<numFrames;i++)
{
IplImage* img = 0;
img=cvRetrieveFrame(capture);
cvShowImage("img", img);
cvWaitKey(10);
}
相关文章:
- 媒体基础 多个视频播放导致内存泄漏和崩溃
- Opencv 树莓派 3 视频播放 c++
- QT 5.8 WebEngine HTML 5视频播放器支持
- C++在32位应用程序之间传输大量数据以进行视频播放的方法
- 媒体基础全景(等距柱状投影)视频播放C++
- 在Qt5中使用Phonon-一个简单的视频播放器
- QML视频播放器,可播放多个视频
- Android:制作原生视频播放器时应该使用什么
- 的视频播放器不起作用
- 线程式视频播放器同步
- 适用于 C++ 的任何跨平台视频播放库
- wx小部件视频播放器
- opencv库视频播放
- 视频播放器问题
- 我如何使用libavfilter在我的视频播放器软件中去交错帧
- 使用 OpenAL 和 C++ 同步音频和视频播放
- DirectShow视频播放太快时音频引脚渲染数据
- 使用Media Foundation进行无缝视频播放
- 免费的音频和视频播放使用Direct3D9和FMOD在VC++2010
- 如何从视频播放器的辅助线程在主窗口中显示