在平时的实验中,经常需要将视频保存为一帧一帧的图片,以获取实验结果;另一方面,很多标准的算法测试数据库都是图片序列(文件名以帧号+图片扩展名),我们可能需要将其转换为视频,因此视频与图片之间的转换是很常见的操作;以下分享一下自己平时编写和使用的两段很简单但是实用的代码;
(由于HTML显示的原因,下面那些单引号全部是双引号)
1.将图片转换为视频
int isColor=1;//图片是否为彩色
double fps=15;//帧率 按照需求设置
int imgW=352;//图片宽度
int imgH=288;//图片高度
char* flieName="videoname.avi";//保存的视频文件名
int
startFrame=0;//图片开始帧号,这样设计主要是因为实验中可能只需要图片的一部分帧序列
int endFrame=128;//同上
char cur_fn[255];//
char*
prefix="E:\\image_sequences\\";//图片序列的路径
char* ext=".jpg";//序列图片后缀名
CvSize
size=cvSize(imgW,imgH);
pWriter=cvCreateVideoWriter(flieName,CV_FOURCC('X','V','I','D'),fps,size,isColor);//OpenCV
库函数,创建视频写入器
IplImage *pImg=NULL;
while(startFrame<=endFrame)
{
strcpy(cur_fn,"");
sprintf(cur_fn,"%s%d%s",prefix,startFrame,ext);//这里的设置适合形如 123.jpg
124.jpg的图片序列
pImg=cvLoadImage(cur_fn,isColor);
if (!pImg)
{
std::cout<<"can't open
file"<<std::endl;
return
0;
}
cvWriteFrame(pWriter,pImg);
cvWaitKey(1);
std::cout<<"Write frame
"<<startFrame<<std::endl;
startFrame++;
cvReleaseImage(&pImg);
}
cvReleaseVideoWriter(&pWriter);//记得用完 释放资源
否则会运行失败
2.将视频转换为图片
这个就比较简单了
char* vedio="videoname.avi";//视频文件路径
CvCapture *cap= cvCaptureFromFile(vedio);
if (cap==NULL)
{
return 0;
}
char cur_fn[255];//图片文件名
char* ext=".jpg";//图片格式
char* prefix="e:\\test\\";//保存图片的文件夹路径
一定要有,因为OpenCV不会自动创建文件夹
IplImage* pImg=NULL;
int frame=0;
while((pImg=cvQueryFrame(cap))!=NULL)
{
frame++;
strcpy(cur_fn,"");
sprintf(cur_fn,"%s%d%s",prefix,frame,ext);//这里的设置适合形如 123.jpg
124.jpg的图片序列
cvSaveImage(cur_fn,pImg,NULL);
cvReleaseImage(&pImg);
}
平时测试算法,截取实验效果图就轻松多了~~~~
加载中,请稍候......