OpenCV读写avi、mpeg文件

简介:
问题:为什么我的电脑支持AVI或者能够播出AVI,但为什么使用cvCreateFileCapture函数总返回NULL呢?
答案:尽管是AVI文件,但也可能使用了某种codec,例如:MJPEG Decompressor。 需要把它转换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. 保存完毕。
(注:成功使用。)

 

 

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、mpeg文件,如需转载请自行联系原博主。

相关文章
|
17天前
|
计算机视觉 数据格式
使用opencv在Qt控件上播放mp4文件
使用opencv在Qt控件上播放mp4文件
24 2
|
4月前
|
传感器 API 开发工具
OpenCV视频读写模块(videoio)
OpenCV视频读写模块(videoio)
OpenCV视频读写模块(videoio)
|
5月前
|
存储 Cloud Native Linux
openCV图像的读写操作
openCV图像的读写操作
|
5月前
|
IDE 开发工具 计算机视觉
关于opencv在PyCharm中没有提示的解决方案mac和win通用(不是改文件和复制)
由于最近有项目需要使用到IDE的debug功能,jupyter notebook没有debug功能,所以需要使用PyCharm。平时使用jupyter的时候也没有遇到opencv没有提示的问题,所以遇到这个问题的时候上网搜索了各种方法包括但不限于:复制文件,修改init文件,降低opencv版本等一系列方法都无效。我在三天内重装了5次系统n次anaconda,终于在最后解决了这个问题,放在这里供大家参考。
|
3月前
|
存储 监控 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为AVI视频格式(C++)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为AVI视频格式(C++)
35 0
|
4月前
|
计算机视觉 Python
Opencv播放视频文件、将视频转换为灰度视频实战(附Python源码)
Opencv播放视频文件、将视频转换为灰度视频实战(附Python源码)
61 0
|
4月前
|
计算机视觉 索引
opencv读取MP4文件和摄像头数据
opencv读取MP4文件和摄像头数据
53 0
|
8月前
|
机器学习/深度学习 人工智能 计算机视觉
LabVIEW中使用opencv快速实现视频的读写
LabVIEW中使用opencv快速实现视频的读写
262 0
LabVIEW中使用opencv快速实现视频的读写
|
Java Linux 计算机视觉
全网首发:Linux自带opencv库的JAVA调用失败/java.lang.UnsatisfiedLinkError:libopencv_ml.so.405: 无法打开共享对象文件
全网首发:Linux自带opencv库的JAVA调用失败/java.lang.UnsatisfiedLinkError:libopencv_ml.so.405: 无法打开共享对象文件
499 0
|
计算机视觉 Python
编译OpenCV:cv2.cpp:23:33: fatal error: numpy/ndarrayobject.h: 没有那个文件或目录
编译OpenCV:cv2.cpp:23:33: fatal error: numpy/ndarrayobject.h: 没有那个文件或目录
55 0