利用opencv2和c++实现视频与图像的互相转换
来源:互联网 发布:阿里云授权服务中心 编辑:程序博客网 时间:2024/04/27 11:09
做图像检测时,我们时常需要对视频进行处理,实现图像的实时检测,这时我们就需要把视频转换为图像进行处理,处理完之后,我们又需要把图像重新转换为视频,下面我将简单实现视频和图像的互相转换。
首先,视频转换为图像:
代码:
// videoANDimage.cpp : 定义控制台应用程序的入口点。//需要修改的地方就是视频的路径需要修改,之后图像输出的位置为视频所在的文件夹#include "stdafx.h"#include <iostream>#include <opencv2\core\core.hpp>#include <opencv2\highgui\highgui.hpp>#include <string>#include <sstream>//#include <stringstream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){cout<<"*******************开始视频转换为图像********************"<<endl;string path("D:\\jiangshan\\videoANDimage\\video2image\\out.avi");//视频路径cv::VideoCapture capture(path);//检查视频是否成功打开if(!capture.isOpened()){cout<<"不能打开视频文件,请检查视频文件路径是否输入正确!"<<endl;return -1;}//获取帧率、帧数double rate=capture.get(CV_CAP_PROP_FPS);long totalFramenumber=(long)capture.get(CV_CAP_PROP_FRAME_COUNT);cout<<"视频的帧数为:"<<totalFramenumber<<endl;cout<<"视频的帧率为:"<<rate<<endl;bool stop(false);cv::Mat frame;//当前视频帧int count=1;string imagepath;string pathtemp;string temp;int m=path.find_last_of('\\');pathtemp.assign(path,0,(m+1));while(true){if(!capture.read(frame))break;stringstream ss;//数字转换为字符串ss<<count++;ss>>temp;if(count<10){imagepath=pathtemp+"image0000"+temp+".jpg";cv::imwrite(imagepath,frame);}else if(count<100){imagepath=pathtemp+"image000"+temp+".jpg";cv::imwrite(imagepath,frame);}else if(count<1000){imagepath=pathtemp+"image00"+temp+".jpg";cv::imwrite(imagepath,frame);}else if(count<10000){imagepath=pathtemp+"image0"+temp+".jpg";cv::imwrite(imagepath,frame);}else if(count<100000){imagepath=pathtemp+"image"+temp+".jpg";cv::imwrite(imagepath,frame);}}capture.release();cout<<"*********************生成图像成功!**********************"<<endl;system("pause");return 0;}
接着是图像转换为视频:
图像传入方式我选择的是路径写在txt中,通过读入txt不断读入图像。txt的生成方式为:建立一个txt文档,把后缀名改为.bat,输入
dir /b/s/p/w *.jpg>list.txt
@pause
保存之后放入图像所在文件,运行即可名为list的txt文件,路径保存于此。
opencv只是一个计算机视觉库而不是一个视频处理编码库。所以开发者们试图将这部分尽可能精简,结果就是opencv能够处理的视频只剩下avi扩展名的了。另外一个限制就是你不能创建超过2GB的单个视频,还有就是每个文件里只能支持一个视频流,不能将音频流和字幕流等其他数据放在里面。另外,任何系统支持的编码器在这里都应该能工作。
要创建视频文件,首先得创建一个VideoWriter类得对象。通过构造函数里的参数和其他合适时机使用open函数打开。需要确定文件的名称,格式,帧率,帧大小,是否彩色。其中格式作为第二个参数,opencv提供的格式是未经过压缩的,目前支持的格式如下:
CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec
CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codecCV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
CV_FOURCC('U', '2', '6', '3') = H263 codec
CV_FOURCC('I', '2', '6', '3') = H263I codec
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
代码:
// image2video.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2\highgui\highgui.hpp>#include <string>#include <fstream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){cout<<"*********************开始图像转换为视频*********************"<<endl;string imagepath("D:\\jiangshan\\videoANDimage\\video2image\\list.txt");int m=imagepath.find_last_of('.');string avipath=imagepath.substr(0,m)+".avi";ifstream File;File.open(imagepath);if(!File.is_open()){cout<<"图像无法读取,请检查图像路径是否有误!"<<endl;return -1;}string imageName;int height;int width;double rate;cout<<"请输入帧率:";cin>>rate;cout<<"请输入图像的宽度:";cin>>width;cout<<"请输入图像的高度:";cin>>height;cout<<"请输入图像是否为彩色,是输入1,不是则输入0! ";int e;bool color=true;cin>>e;if(e==0){color=false;}cv::VideoWriter writer;writer.open (avipath,CV_FOURCC('M', 'J', 'P', 'G'),rate,cv::Size(width,height),color);if(!writer.isOpened()){cout<<"Could not open the writer for write!"<<endl;return -1;}while(getline(File,imageName)){cv::Mat image=cv::imread(imageName);if(!image.data){cout<<"Could not load image file..."<<endl;return -1;}writer<<image;}cout<<"*********************生成视频成功!*********************"<<endl;system("pause");return 0;}
0 0
- 利用opencv2和c++实现视频与图像的互相转换
- 图像与视频互相转换
- 利用MATLAB进行图像和视频之间的转换
- 利用opencv2.4.10+VS2012和RobHess的sift特征算法实现全景图像拼接
- Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原
- Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原
- Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原
- Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原
- Flex中利用ByteArray与BitmapData互相转换实现图片的二进制保存与复原
- [C#] 十六进制 与 十进制 的互相转换
- js中利用正则表达式实现空格与换行的互相转换
- 利用DOM4J 实现对 XML 与 MAP、LIST 的互相转换。
- 利用JAXB实现java实体类和xml互相转换
- 灰度图像和彩色图像互相转换
- 灰度图像和彩色图像互相转换
- 利用C++中的stringstream类轻松实现字符串和数字的互相转换
- 视频与图片序列之间的互相转换
- 图像与视频的相互转换
- 关于内存函数GlobalLock(),GlobalAlloc(),GlobalUnLock()用法
- 入职第一天总结----web.xml配置说明
- 地图坐标查询api
- Unity3D研究院之两种方式播放游戏视频
- 几条 ffmpeg 的命令
- 利用opencv2和c++实现视频与图像的互相转换
- Java的知识分享
- android 串口编程总结
- android-cardview简单使用
- linux socket编程
- HTML特殊字符编码对照表
- 短信api
- fresco 编译问题
- nginx-虚拟主机,访问控制,防盗链,代理服务