2017-02-16 61 views
-1

我正在製作一個關於提取視頻幀並將其重新制作成視頻的小型項目。 如何將序列圖像重新制作回視頻?如何通過opencv製作帶有序列圖像的視頻

這是我提取視頻幀代碼的一部分。

if (n_frame % 3 == 0) 
     { 
      //Save an image 
      sprintf(filename, "frame%.3d.jpg", n_save++); 
      imwrite(filename, frame); 
      cout << "save: " << filename << endl; 

     } 

我給我的圖片命名爲frame000,frame001,frame002 ....等。

我使用的是opencv 2.4.11。

非常感謝!

+0

訪問[本頁](http://stackoverflow.com/questions/13623394/how-to-write-video-file-in-opencv-2-4-3?rq=1) –

+0

可能[如何在OpenCV 2.4.3中編寫視頻文件]的副本(http://stackoverflow.com/questions/13623394/how-to-write-video-file-in-opencv-2-4-3) –

回答

0

你需要VideoWriter - http://docs.opencv.org/trunk/dd/d9e/classcv_1_1VideoWriter.html

一旦你所需的文件類型和路徑構造它,你用含有使用< <操作框架墊對象給它 - 即

auto frame = cv::imread("somePicture.png"); 
auto writer = cv::VideoWriter("out.avi", VideoWriter::fourcc('M','J','P','G'), 24, frame.size()); 
writer << frame; 
writer.release(); 

上面的代碼會讀將其送入具有24fps和MJPG格式和AVI容器的視頻文件,然後使用release()方法關閉寫入器。

0

您使用FFmpegFrameRecorder

字符串路徑= Environment.getExternalStorageDirectory()的getPath()+ 「/ Video_images」。

 File folder = new File(path); 

     File[] listOfFiles = folder.listFiles(); 

     if (listOfFiles.length > 0) { 

      iplimage = new opencv_core.IplImage[listOfFiles.length]; 

      for (int j = 0; j < listOfFiles.length; j++) { 

       String files = ""; 

       if (listOfFiles[j].isFile()) { 
        files = listOfFiles[j].getName(); 
        System.out.println(" j " + j + listOfFiles[j]); 
       } 

       String[] tokens = files.split("\\.(?=[^\\.]+$)"); 
       String name = tokens[0]; 

       iplimage[j] = cvLoadImage(Environment.getExternalStorageDirectory().getPath() + "/Video_images/" + name + ".jpg"); 

      }  

recorder = new FFmpegFrameRecorder(Constn.SS,480,480);

 try { 
      recorder.setVideoCodec(13); 
      recorder.setFrameRate(0.4d); 
      recorder.setPixelFormat(0); 
      recorder.setVideoQuality(1.0d); 
      recorder.setVideoBitrate(4000); 
      startTime = System.currentTimeMillis(); 
      recorder.start(); 
      int time = Integer.parseInt(params[0]); 
      resp = "Slept for " + time + " milliseconds"; 
      for (int i = 0; i < iplimage.length; i++) { 
       long t = 1000 * (System.currentTimeMillis() - startTime); 
       if (t < recorder.getTimestamp()) { 
        t = recorder.getTimestamp() + 1000; 
       } 
       recorder.setTimestamp(t); 
       recorder.record(iplimage[i]); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
相關問題