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);
读出的帧数正常,另外释放内存的函数我在程序结束之前有调用
对出错的文件,看读出的帧数是否和实际值一样,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 视频问题的主要内容,如果未能解决你的问题,请参考以下文章