2017-02-16 32 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(); 
     } 
相关问题