如何使用opencv制作带有序列图像的视频

时间:2017-02-16 11:11:09

标签: opencv image-processing video

我正在制作一个关于提取视频帧并将其重新制作成视频的小项目。 如何将序列图像重新制作成视频?

以下是我提取视频帧代码的一部分。

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。

非常感谢!

2 个答案:

答案 0 :(得分:1)

您使用了FFmpegFrameRecorder

String path = Environment.getExternalStorageDirectory()。getPath()+&#34; / Video_images&#34;;

        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();
        }

答案 1 :(得分:0)

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

使用所需的文件类型和路径构建它后,使用&lt;&lt;&lt;&lt;&lt;&lt;&lt;运营商 - 即。

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()方法将关闭编写器。