在图像处理的研究中,对每个人来说所需处理的数据不同,图像转视频和视频转图像是非常常用的操作,在此与大家分享这两个代码,都是用C++和opencv实现的,自己写的,绝对能用。
图像转视频:
#include <cv.h>
#include <iostream>
#include <highgui.h>
using namespace cv;
using namespace std;
#define NUM_FRAME 24560 //最大图像个数,根据自己情况修改
int main()
{
int i = 0;
Mat img;
char image_name[100];
printf("-------- image to video --------\n");
VideoWriter writer;
int isColor = 1;
int fps = 25;
int frameW = 640;
int frameH = 480;
//创建视频写入器
writer=VideoWriter("out.avi",CV_FOURCC('P','I','M','1'),fps,cvSize(frameW,frameH),isColor);
printf("video height : %d\nvideo width : %d\nfps : %d\n", frameH, frameW, fps);
//创建视频播放窗口
while(i<NUM_FRAME)
{
sprintf(image_name, "E:\\soucedata\\BMC-Dataset\\Evaluation_Rotary_1\\122_png\\input\\%d.png", ++i);
img = imread(image_name);
if(!img.data) //图片不存在则跳过继续处理下一帧
{
continue;
}
imshow("mainWin", img);
char key = waitKey(20);
writer.write(img);
img.release();
}
cout << "--------image to video over---------" << endl;
writer.release();
destroyWindow("mainWin");
return 0;
}
视频转图像:
#include <iostream>
#include <string>
#include <vector>
#include <cv.h>
#include <highgui.h>
using namespace std;
using namespace cv;
int main()
{
string videopath = "E:\\Project\\vs2012\\Video2Img\\Video2Img\\out.avi";
VideoCapture capture(videopath);
Mat frame;
//获取整个视频帧数
long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
cout << "此个视频共" << totalFrameNumber << "帧" << "\n"<<endl;
while(1)
{
if(!capture.read(frame))
{
cout << "读取视频失败" << endl;
return -1;
}
//imshow("img",frame);
int fs1 = capture.get(CV_CAP_PROP_POS_FRAMES)-1;
ostringstream outbuff;
outbuff << "E:\\Project\\vs2012\\Video2Img\\Video2Img\\img\\" << fs1 << ".jpg";
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
imwrite(outbuff.str(), frame, compression_params);
}
capture.release();
return 0;
}
其实matlab处理这两个问题也许更简单,但是我这个大水货一直掌握不了matlab内存操作的精髓,每次都是“OUT OF MEMORY”,最终投奔C++&opencv,效果还不错,有空了借助QT将其封装一下,就好用了。