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、用opencv打开AVI格式文件
我的用的VISTA系统+VC6.0+opencv1.0
注意:使用XP系统也一样。
(1)首先要安装opencv1.0 。详细安装方法见http://www.opencv.org.cn/index.php/VC6下安装与配置
(2)安装XviD 解码器。安装方法见
http://www.opencv.org.cn/index.php/�% ... 2述
这一步很重要,如果不安装XVID解码器,在后来打开或保存视频时可能会失败。
(3)打开AVI文件的代码如下:
代码:
#include <string>
using namespace std;
int main()
{
IplImage *frame = NULL;
CvCapture *capture = NULL;
capture = cvCaptureFromAVI("test.AVI");
frame = cvQueryFrame(capture);
cvNamedWindow("frame");
while(frame){
cvShowImage("frame", frame);
cvWaitKey(20);
cout << "Frame Grabbed." << endl;
frame = cvQueryFrame(capture);
}
return 0;
}
找一个AVI视频,把名字改为“test”,放入工程中,运行程序便可打开视频文件。
2、用摄像头读入视频并保存为AVI格式文件
我用笔记本带的摄像头调试运行成功,特别注意创建视频文件时,要使用CV_FOURCC('X', 'V', 'I', 'D'),其他格式不一定能成功。代码如下:
- 代码: 全选
-
#include "cv.h"
#include "highgui.h"
#include <ctype.h>
#include <stdio.h>
int main( int argc, char** argv )
{
IplImage* img = 0;
int nFrames = 50;
CvCapture* capture = 0;
CvVideoWriter *writer = 0;
int isColor = 1;
int fps = 25; // or 30
int frameW = 640; //
int frameH = 480; //
if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );
if( !capture )
{
fprintf(stderr,"Could not initialize capturing...\n");
return -1;
}
writer=cvCreateVideoWriter("out.avi",CV_FOURCC('X','V','I','D'),
fps,cvSize(frameW,frameH),isColor);
//存储视频文件 CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0
for(int i=0;i<nFrames;i++)
{
cvGrabFrame(capture); // 抓取帧
img=cvRetrieveFrame(capture); // 恢复图像
cvWriteFrame(writer,img); // 将帧添加入视频文件
//显示所抓视频
cvNamedWindow("Live", CV_WINDOW_AUTOSIZE);//创建窗口
cvShowImage("Live", img);//显示所抓视频
cvWaitKey(20); // wait 20 ms
}
cvReleaseVideoWriter(&writer);
return 0;
}
3、用opencv打开MPEG格式文件和用摄像头读入并保存文件。
先解释一下为什么要把AVI格式和MPEG格式分开介绍。
Opencv1.0原来并不支持MPEG格式,后来技术进步了,说只要更新一下库就可以
(http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=1118&p=4118&hilit=read+mpeg&sid=cb83023cfdf58226e379e66929f0813a#p4118),但更新库的方法是用英语介绍的,我到现在也没读明白。因此我郁闷了很长一段时间,后来到国图借了一本介绍opencv的书,还从网上下了<< learning opencv>>这本书,看到if you want to read a fi le encodedwith DIVX or MPG4 compression on a Windows machine, there are specific DLLs thatprovide the necessary resources to decode the video.也就是对于Windows、Linux和Mac OS三种系统下,需要分别安装专门的DLLs才能支持读写MPEG文件。尽管知道了这一点,我还是没能用opencv1.0实现打开MPEG文件。
于是,我下了最新版本的opencv2.0,我想最新版本应该不用再加什么就可以用了吧,但是这个版本已经不支持VC6.0了,我就又装载了VC 2008 Express。VC 2008 Express下安装opencv2.0的方法见http://www.opencv.org.cn/index.php/VC_2008_Express下安装OpenCV2.0
安装完后我运行了一下程序,发现还是不行。在网上看见有人说要安装ffdshow,于是我装了这个,再运行一下果然可以了,我并不知道为什么,我也菜鸟,但能够打开和保存MPEG文件就可以了,我要的就是这个结果。
打开MPEG文件的代码如下:
- 代码: 全选
-
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
IplImage *frame = NULL;
CvCapture *capture = NULL;
capture = cvCreateFileCapture( "test.mp4" );
frame = cvQueryFrame(capture);
cvNamedWindow("frame");
while(frame){
cvShowImage("frame", frame);
cvWaitKey(20);
cout << "Frame Grabbed." << endl;
frame = cvQueryFrame(capture);
}
return 0;
}
用摄像头读入视频并保存为MPEG格式文件代码:
- 代码: 全选
-
#include "cv.h"
#include "highgui.h"
#include <ctype.h>
#include <stdio.h>
int main( int argc, char** argv )
{
IplImage* img = 0;
int nFrames = 500;
CvCapture* capture = 0;
CvVideoWriter *writer = 0;
int isColor = 1;
int fps = 25; // or 30
int frameW = 640; //
int frameH = 480; //
if( argc == 1 || (argc == 2 && strlen(argv[1]) == 1 && isdigit(argv[1][0])))
capture = cvCaptureFromCAM( argc == 2 ? argv[1][0] - '0' : 0 );
if( !capture )
{
fprintf(stderr,"Could not initialize capturing...\n");
return -1;
}
writer=cvCreateVideoWriter("out.mp4",CV_FOURCC('D','I','V','X'),
fps,cvSize(frameW,frameH),isColor);
//存储视频文件CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0
for(int i=0;i<nFrames;i++)
{
cvGrabFrame(capture); // 抓取帧
img=cvRetrieveFrame(capture); // 恢复图像
cvWriteFrame(writer,img); // 将帧添加入视频文件
//显示所抓视频
cvNamedWindow("Live", CV_WINDOW_AUTOSIZE);//创建窗口
cvShowImage("Live", img);//显示所抓视频
cvWaitKey(20); // wait 20 ms
}
cvReleaseVideoWriter(&writer);
return 0;
}
细心的朋友会发现,打开AVI和MPEG的代码只改变了一句,保存时也是这样。其实很多时候运行不出结果不是因为代码有错,而是没安装必要的解码器或者有些库不支持某些函数。
4、关于argc, argv的问题
现在很多书上的程序例子都用main( int argc, char** argv )这种形式,这种程序有时候运行时会一闪而过,菜鸟们往往不知道该怎么办才好。argc, argv有什么意义,我没有完全理解,大家可以百度一下。我说一下解决办法。
现在假设有一个名为“example”的工程在C盘根目录下,其作用是打开一个AVI视频文件。那么首先用VC编译一下,会看到工程里多了一个名为“debug”的文件,里面包含了一个exe文件。把要打开的AVI视频复制到debug文件里。然后在运行输入cmd,进入命令提示符窗口,输入“CD C:\example\debug”,回车后输入“example.exe test.avi”回车后就可看到运行结果。
注意:这里假设exe文件名为example,AVI文件名为test,可根据实际情况改动。
Opencv是一个很好用的工具,但是初学者往往会遇到这样那样的困难,如果没有高手指导,只能自己去查资料,这里推荐两个很有用的论坛:
一个就是本论坛,还有就是opencv-users http://n2.nabble.com/opencv-users-f1802565.html
最后,限于作者本人的水平,代码来至网上和书上,本文仅供参考。
OpenCV读取AVI文件相关推荐
- opencv读取avi视频解码问题
遇到了opencv读取avi视频一闪而过的问题,cvCreateFileCapture函数总返回NULL. 找了半天,一直没办法解决,后来终于发现是这么回事. 方法一:(这办法很笨,而且很不建议这样做 ...
- opencv读取avi视频并抽取帧
opencv读取avi视频并抽取帧 #include "stdafx.h" #include <opencv2/opencv.hpp>using namespace s ...
- OpenCV读取视频文件的实例(附完整代码)
OpenCV读取视频文件的实例 OpenCV读取视频文件的实例 OpenCV读取视频文件的实例 #include <iostream> // for standard I/O #inclu ...
- [转载]vfw的AVI族函数读取AVI文件
#include "vfw.h"#pragma comment(lib, "vfw32.lib") #pragma comment(lib, "Win ...
- OpenCV——读取视频文件并写入文件
1.代码如下: #include<opencv2/opencv.hpp> using namespace cv;//-----------------------------------[ ...
- c语言如何读取avi文件,avilib库的使用
avilib库介绍 avilib顾名思义,是对avi文件处理的工具.他是一个使用c语言编写的库,可以很方便的对avi文件提取帧和生成avi视频文件.如下列出avilib库的代码. 2. avilib的 ...
- matlab读取avi文件出错
1,出现问题 在使用matlab做实验的时候出现问题,具体信息如下: >> m2=aviread('C:/test.avi'); ??? Error getting frame data. ...
- [mac]matlab for mac —关于无法读取avi文件的解决方法
今天上课,老师让我们做运动物体识别,给了我们一个avi格式的视频,班上的同学都用学校提供的windows的虚拟机上的matlab来运行,可实在是速度太慢了.自己早早就下载了mac版本的matlab.可 ...
- c++ OpenCV 读取某个文件夹下的所有图片
方案一 #include <vector> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> ...
最新文章
- springboot(十六):使用Jenkins部署Spring Boot
- 前端JavaScripts基础知识点讲义代码
- Fiori里的exception继承
- 为什么要监控sql语句,以及如何监控,都有哪几种方式可以监控。
- 【经典重温】所有数据无需共享同一个卷积核!谷歌提出条件参数化卷积CondConv(附Pytorch复现代码)...
- [CF Skills]如何在预定的时间运行你的程序
- 【算法导论第13章】红黑树
- hdu 4004The Frog's Games 二分查找!!!!!!!
- fedora arm linux gcc,fedora17中安装arm-linux-gcc交叉编译器.doc
- 目前3个最受欢迎的免费、开源文件加密软件评测
- c语言蝴蝶图案代码,通达信指标公式,临界点蝴蝶图案出现,暴涨趋势出现(附源码)...
- 信息学奥赛一本通网站注册账号流程
- python pyhook_python使用pyHook.HookManager()返回来的event中,event.Time怎么转换成为datetime形式?...
- 分布式文件存储SeaweedFS试用对比总结
- mysql实现跨库查询
- Kite Compositor制作下雨打雷特效详细教学
- YBC携手IZO打造创业家的摇篮
- 数据分析SQL环比增长率、同比增长率
- 永不断电的IPONE4
- tcl 950 android 7,TCL 950测评:商务旗舰手机界的一股清流
热门文章
- AVR单片机Atmega128外扩RAM
- 2018 形势、影响与心态
- 用物理光学建模演示点阵投影仪的工作原理
- cia402 状态字_解析CiA402
- 【My Electronic Notes系列——正弦波振荡电路】
- 汽车称重软件的秤台和车辆管理有哪些要求(二)
- 如何实现BIM模型与空调负荷计算软件的链接
- 一个环由个圈组成,把自然数1,2,…,N分别放在每一个圆内,数字的在两个相邻圈之和应该是一个素数。 注意:第一圈数应始终为1。input: N(0~20)output:输出格式如下所示的样品。
- 关于QQ和360的口水战
- 微软面试题4-6 (偏向经典面试题)