視頻和圖片的相互轉換

////////////////////////////////////////////////////////////////////////
//
// test3.cpp
//
// 該程序實現視頻和圖片的相互轉換.
// Image_to_video()函數將一組圖片合成AVI視頻文件.
// Video_to_image()函數將AVI視頻文件讀入,將每一幀存儲爲jpg文件.
//
////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>

#define NUM_FRAME 300 //只處理前300幀,根據視頻幀數可修改


void Video_to_image(char* filename)
{
printf("------------- video to image ... ----------------n");

//初始化一個視頻文件捕捉器
CvCapture* capture = cvCaptureFromAVI(filename);

//獲取視頻信息
cvQueryFrame(capture);
int frameH    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
int frameW    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
int fps       = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
printf("tvideo height : %dntvideo width : %dntfps : %dntframe numbers : %dn", frameH, frameW, fps, numFrames);

//定義和初始化變量
int i = 0;
IplImage* img = 0;
char image_name[13];

cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );

//讀取和顯示
while(1)
{
  
   img = cvQueryFrame(capture); //獲取一幀圖片
   cvShowImage( "mainWin", img ); //將其顯示
   char key = cvWaitKey(20);
  
   sprintf(image_name, "%s%d%s", "image", ++i, ".jpg");//保存的圖片名
  
   cvSaveImage( image_name, img);   //保存一幀圖片


   if(i == NUM_FRAME) break;
}

cvReleaseCapture(&capture);
cvDestroyWindow("mainWin");
}

 

void Image_to_video()
{
int i = 0;
IplImage* img = 0;
char image_name[13];

printf("------------- image to video ... ----------------n");

//初始化視頻編寫器,參數根據實際視頻文件修改
CvVideoWriter *writer = 0;
int isColor = 1;
int fps     = 30; // or 25
int frameW = 400; // 744 for firewire cameras
int frameH = 240; // 480 for firewire cameras
writer=cvCreateVideoWriter("out.avi",CV_FOURCC('X','V','I','D'),fps,cvSize(frameW,frameH),isColor);

printf("tvideo height : %dntvideo width : %dntfps : %dn", frameH, frameW, fps);

//創建窗口
cvNamedWindow( "mainWin", CV_WINDOW_AUTOSIZE );

while(i<NUM_FRAME)
{
   sprintf(image_name, "%s%d%s", "image", ++i, ".jpg");
   img = cvLoadImage(image_name);
   if(!img)
   {
    printf("Could not load image file...n");
    exit(0);
   }
   cvShowImage("mainWin", img);
   char key = cvWaitKey(20);

   cvWriteFrame(writer, img);
}

cvReleaseVideoWriter(&writer);
cvDestroyWindow("mainWin");
}


int main(int argc, char *argv[])
{

char filename[13] = "infile.avi";

Video_to_image(filename); //視頻轉圖片

Image_to_video();    //圖片轉視頻

return 0;
}
//-------------------------------------------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章