OPENCV2.4学习笔记——用OpenCv创建视频
来源:互联网 发布:pureftpd mac 安装 编辑:程序博客网 时间:2024/04/30 18:15
视频文件的结构:
如你所见,视频文件确实比图像文件要复杂很多。然而OpenCV只是个计算机视觉库而不是一个视频处理编码库。所以开发者们试图将这个部分尽可能地精简,结果就是OpenCV能够处理的视频只剩下avi 扩展名的了。另外一个限制就是你不能创建超过2GB的单个视频,还有就是每个文件里只能支持一个视频流,不能将音频流和字幕流等其他数据放在里面。尽管如此,任何系统支持的编解码器在这里应该都能工作。如果这些视频处理能力不够你使用的话,我想你应该去找一些专门处理视频的库例如FFMpeg 或者更多的编解码器例如 HuffYUV , CorePNG 和 LCL 。你可以先用OpenCV创建一个原始的视频流然后通过其他编解码器转换成其他格式并用VirtualDub 和 AviSynth 这样的软件去创建各种格式的视频文件
关于视频编解码器:
用OpenCv创建视频:
1.其操作在 VideoWriter 类中,open 函数来打开,write 函数向这个对象按照序列发送一些图像帧。
2.下面的程序代码做的工作主要有这几样:
源代码:
#include <iostream>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc,char *argv[],char *window_name)
{
//读取视频
const string source = "Global.avi";
VideoCapture inputVideo(source);
//判断是否读取成功
if (!inputVideo.isOpened())
{
cout<<"could not open the video"<<endl;
return -1;
}
string::size_type pAt = source.find_last_of('.');
char channelNum;
cout<<"Please input the number of channel you want to release(R,G,B):";
cin>>channelNum;
const string NAME = source.substr(0,pAt) + channelNum + ".avi";
int ex = static_cast<int>(inputVideo.get(CV_CAP_PROP_FOURCC));
char EXT[] = {ex & 0XFF,(ex & 0XFF00)>>8,(ex & 0XFF0000) >> 16,(ex & 0XFF000000) >> 24,0};
Size S = Size((int)inputVideo.get(CV_CAP_PROP_FRAME_WIDTH),(int) inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT));
char choice;
cout<<"Please input yes 'Y' or no 'N'(N:使用视频输入格式来创建输出文件,Y:弹出一个对话框来让你选择编码器。):"<<endl;
cin>>choice;
const bool askOutputType = choice =='Y';
VideoWriter outputVideo;
if (askOutputType)
{
outputVideo.open(NAME,ex = -1,inputVideo.get(CV_CAP_PROP_FPS),S,true);
}
else
outputVideo.open(NAME , ex, inputVideo.get(CV_CAP_PROP_FPS),S, true);
if (!outputVideo.isOpened())
{
cout << "Could not open the output video for write: " << source << endl;
return -1;
}
//输出视频尺寸和帧数
cout << "Input frame resolution: Width=" << S.width << " Height=" << S.height
<< " of nr#: " << inputVideo.get(CV_CAP_PROP_FRAME_COUNT) << endl;
//输出编码器类型
cout << "Input codec type: " << EXT << endl;
int channel=2;
switch(channelNum)
{
case 'R':{channel =2 ;break;}
case 'G':{channel = 1 ;break;}
case 'B':{channel = 0 ;break;}
}
Mat src,res;
vector<Mat> spl;
while(true)
{
inputVideo>>src;
if(src.empty()) break;
split(src,spl);
for(int i = 0;i<3;i++)
if(i!=channel)
spl[i] =Mat::zeros(S,spl[0].type());
merge(spl,res);
outputVideo<<res;
}
cout<<"Finished writing"<<endl;
return 0;
}
运行结果:
- OPENCV2.4学习笔记——用OpenCv创建视频
- opencv学习笔记 1——安装opencv2.49+VS2013
- Opencv学习笔记——视频进度条
- OpenCv学习笔记——OpenCV捕获视频
- 视频加载、处理、输出-----opencv2.0学习笔记4
- OpenCV学习笔记 -- VS2010 + OpenCV2.3配置
- 用OpenCv创建视频
- 用OpenCV创建视频
- OpenCV学习笔记——VideoWriter生成视频流highgui
- OpenCV学习笔记(2)——播放视频
- Opencv学习笔记——视频进度条的随动
- OpenCV学习笔记(3)——进度条视频播放控制
- OpenCV学习笔记——视频的边缘检测
- OpenCV学习笔记(3)——进度条视频播放控制
- OpenCV学习笔记(2)——播放视频
- opencv学习笔记—播放AVI视频(下)
- Opencv学习笔记----读取视频
- OpenCV学习笔记--视频读写
- js鼠标环绕效果
- IOS_Sqlite
- English
- linux上使用strace查看C语言级别的php源码【一种方法】
- HTTP Operational Model and Client/Server Communication
- OPENCV2.4学习笔记——用OpenCv创建视频
- 用Ajax,jquery取时间时变成/Date(1355414400000)
- MFC 窗口自动填充 消息Onsize()
- AJAX入门详解(一)
- Android系统中setprop,getprop,watchprops命令的使用
- MFC 分栏
- 网赢宝告诉您,如何看关键词的优化好不好?
- MFC DoDataExchange()绑定技术
- 改变初始化视图