首页 > 其他 > 详细

Opencv读取视频一闪而过情况分析

时间:2014-04-12 22:54:58      阅读:524      评论:0      收藏:0      [点我收藏+]

在参加一个软件比赛需要用opencv对视频的处理,也碰到了一些问题。最常见的就是视频一闪而过了,当时网上找了很久答案都没找到觉得我的问题,现在我来终结一下估计是比较全的了。

先说明我用的是vs2012+opencv(2.4.8),c++编程;

关于配置就不说了网上很多

代码如下:

//#include "stdafx.h" #include"highgui.h" #include"cv.h"

//声明一个CvCapture类型指针 用于接收cvCreateFileCapture的返回值 CvCapture* g_capture = NULL; //记录滚动条的当前位置 int g_slider_pos = 0 ; //对视频帧进行计数的变量 int frame_count = 0;

//滚动条的回调函数  参数int pos 是指当前滚动条所在位置 void on_changed(int pos) {                //设置g_capture的属性  使得 从位置pos开始播放视频                 cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);       //在拉动滚动条后  保持变量frame_count与滚动条的位置是同步的                                frame_count = pos ; }

int main(int argc,char* argv[]) {            //创建一个窗口                          cvNamedWindow( "show");       //打开有一个视频文件                 g_capture=cvCreateFileCapture("D:\\car.mp4");       //获取视频的总帧数                  int frames=(int )cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT);                     if(frames>0)                 {             //在窗口show上创建名字为Position的滚动条                                 cvCreateTrackbar( "Position","show" ,&g_slider_pos,frames,on_changed);                 }              //图像指针变量                 IplImage* frame;

                 while(1)                 {             //从g_capture获取一帧图像 填充到相应的内存缓冲区                                 frame=cvQueryFrame(g_capture);             //如果到视频结尾 则退出循环                                  if(!frame) break ;             //显示图像                                 cvShowImage( "show",frame);             //接收用户按键                                 char c = cvWaitKey(33);             //如果接收到 按键‘Esc‘ 则退出循环                                  if(c==27)                                                  break;             //滚动条 随着视频的播放 进行移动                                 cvSetTrackbarPos( "Position","show" ,frame_count);                                 frame_count++;                 }       //释放资源                 cvReleaseCapture(&g_capture);                 cvDestroyWindow( "show");               // getchar();     return 0; }

1.网上很多说是avi格式问题,尽管是AVI文件, 需要把它转换OpenCV支持的AVI文件. OpenCV支持的AVI如下:

Container

FourCC

Name

Description

AVI

‘DIB ‘

RGB(A)

Uncompressed RGB, 24 or 32 bit

AVI

‘I420‘

RAW I420

Uncompressed YUV, 4:2:0 chroma subsampled

AVI

‘IYUV‘

RAW I420

identical to I420

转换格式解决方法:解决方法1:下载mencoder.exe, 在window命令行下使用: mencoder in.avi -ovc raw -vf format=i420 -o out.avi(注:我测试了这个方法,没有成功,原因不详,希望有朋友们能够详细讨论一下。)解决方法2:下载VitualDub, 我使用1.9.4版本a. File->Open Video File;b. Video->Filters->Add->Convert format; 选择4:2:0 Planar YCbCr (YV12)或者 32-Bit RGB。c. Save as AVI. 保存完毕。”

还有网上说opencv只支持avi格式至少我现在用的2.4.8还能支持MP4格式了,还跑得不错。

2.其实还有一个问题也是我碰到的,当初弄了好久才发现,就是在配置环境变量时path路径一定要看清楚是否写对,否则同样的代码和视频文件在别人电脑上跑得好好的就你的有问题,可能就是这个问题了。

好了这是我写的第一篇博客,写的不好多多见谅!!!

 

Opencv读取视频一闪而过情况分析,布布扣,bubuko.com

Opencv读取视频一闪而过情况分析

原文:http://www.cnblogs.com/BasilLee/p/3660593.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!