OpenCV 视频问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV 视频问题相关的知识,希望对你有一定的参考价值。

我正在学习OpenCV 参照例子写了个读取视频文件并显示程序
但是只能显示出前面一百多帧后面的就读不到了,我用定位的函数试过,确实后面的帧读不出来,而且不同的视频文件可以读出来的帧的数量还不同
附部分代码
CvCapture* capture = cvCreateFileCapture("F://动漫//银河英雄传说//决斗者//[LoGH][Kettosya_01][GB](E5CCBB7E).avi");
if(!cvGrabFrame(capture)) // capture a frame
printf("Could not grab a frame\n\7");
exit(0);

cvQueryFrame(capture); // 在读取视频流信息前,要先执行此操作
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);
float posMsec = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_MSEC);
int posFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES);
float posRatio = cvGetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO);
CvVideoWriter *writer = 0;
int isColor = 1;
cvNamedWindow("mainWin_1", CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin_1", 600, 100);
IplImage* img1=0;
for(i=0;i<numFrames;i++)

if(!cvGrabFrame(capture)) break;
printf("i=%d\n",i);
img1=cvRetrieveFrame(capture);
if(!img1) break;
cvShowImage("mainWin_1", img1);
if(cvWaitKey(1000/fps)>0) break;
printf("i=%d\n",i);

读出的帧数正常,另外释放内存的函数我在程序结束之前有调用

参考技术A int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
对出错的文件,看读出的帧数是否和实际值一样,OpenCV读出的帧数有时有问题
参考技术B 可能是内存泄露啊,没有释放内存,内存满了就会出错的,要在最后释放内存,用cvReleaseCapture等函数 参考技术C 把for循环改成while试试?
while(1)
frame = cvQueryFrame( capture );
if( !frame ) break;
cvShowImage( "mainWin_1", frame );
char c = cvWaitKey(33);
if( c == 27 ) break;
本回答被提问者采纳

如何读取用于 openCV 的视频文件?

【中文标题】如何读取用于 openCV 的视频文件?【英文标题】:How can I read a video file for use in openCV? 【发布时间】:2011-10-13 18:20:41 【问题描述】:

我想从“avi 文件”中读取视频文件,然后逐帧输入以在 openCV 中进行处理。 我怎样才能做到这一点? openCV中是否有相应的功能?我应该使用视频阅读框架吗?

什么是阅读视频文件的好框架?

【问题讨论】:

【参考方案1】:

使用视频序列 从视频序列中捕获一帧

从相机初始化捕捉:

CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0

从文件初始化捕获:

CvCapture* capture = cvCaptureFromAVI("infile.avi");
Capturing a frame:

IplImage* img = 0; 
if(!cvGrabFrame(capture))              // capture a frame 
    printf("Could not grab a frame\n\7");
    exit(0);

img=cvRetrieveFrame(capture);// retrieve the captured frame

要同时从多个摄像头获取图像,请先从每个摄像头抓取一张图像。抓取完成后获取抓图。

释放捕获源:

cvReleaseCapture(&capture);

注意设备捕获的图像由捕获函数分配/释放。没有必要明确地释放它。

【讨论】:

你也可以试试hitl.washington.edu/artoolkit/documentation/devframework.htm(ARToolkit 框架),但我会推荐 OpenCV 非常感谢。问题:cvGrabFrame 和 cvRetrieveFrame 有什么区别? openCV 支持所有类型的视频还是只支持 avi?

以上是关于OpenCV 视频问题的主要内容,如果未能解决你的问题,请参考以下文章

在 qlabel 上显示 openCv 视频的奇怪问题

使用 openCV 阅读视频

使用opencv稳定视频

opencv 用摄像头录制视频并储存的问题

OpenCV,捕获的视频比原始相机视频运行得更快!

opencv库视频播放[关闭]