如何进行视频取景?

时间:2019-07-12 07:17:26

标签: python c++ opencv

我想输入视频并逐帧保存视频,我使用opencv python做到了,但是我想要在c ++中实现。 作为C ++的新手,请帮助我。

这是我的python代码

import cv2 

# Function to extract frames 
def FrameCapture(path): 

    # Path to video file 
    vidObj = cv2.VideoCapture(path) 

    # Used as counter variable 
    count = 0

    # checks whether frames were extracted 
    success = 1

    while success: 

        # vidObj object calls read 
        # function extract frames 
        success, image = vidObj.read() 

        # Saves the frames with frame-count 
        cv2.imwrite("frame%d.jpg" % count, image) 

        count += 1

# Driver Code 
if __name__ == '__main__': 

    # Calling the function
    FrameCapture(path of the video)

2 个答案:

答案 0 :(得分:0)

Here is what you need. This code simply read frame and write it to a directory. 




#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int, char**)
{
    Mat src;
    // use default camera as video source
    VideoCapture cap(0);
    // check if we succeeded
    if (!cap.isOpened()) {
        cerr << "ERROR! Unable to open camera\n";
        return -1;
    }
    // get one frame from camera to know frame size and type
    cap >> src;
    // check if we succeeded
    if (src.empty()) {
        cerr << "ERROR! blank frame grabbed\n";
        return -1;
    }
    bool isColor = (src.type() == CV_8UC3);
    //--- INITIALIZE VIDEOWRITER
    VideoWriter writer;
    int codec = VideoWriter::fourcc('M', 'J', 'P', 'G');  // select desired codec (must be available at runtime)
    double fps = 25.0;                          // framerate of the created video stream
    string filename = "/home/rnd/TEST/live.avi";             // name of the output video file
    writer.open(filename, codec, fps, src.size(), isColor);
    // check if we succeeded
    if (!writer.isOpened()) {
        cerr << "Could not open the output video file for write\n";
        return -1;
    }
    //--- GRAB AND WRITE LOOP
    cout << "Writing videofile: " << filename << endl
         << "Press any key to terminate" << endl;
    for (;;)
    {
        // check if we succeeded
        if (!cap.read(src)) {
            cerr << "ERROR! blank frame grabbed\n";
            break;
        }
        // encode the frame into the videofile stream
        writer.write(src);
        // show live and wait for a key with timeout long enough to show images
        imshow("Live", src);
        if (waitKey(5) >= 0)
            break;
    }
    // the videofile will be closed and released automatically in VideoWriter destructor
    return 0;
}

答案 1 :(得分:0)

我对编程还是很陌生的,尤其是在OpenCV中,但是我认为您可以这样做:

1)在while循环中有一个字符串,该字符串将用于在该字符串中写入当前帧。因此,您可以将当前计数转换为字符串,并将当前帧称为“ Image_1.png”,“ Image_2.png”等。

frame_string = "Image_" + std::to_string(count + 1) + ".png";

2)将当前字符串写为输出帧,因此,frame_string将是您的帧名称,而current_frame将是当前从视频中检测到的帧。

cv::imwrite(frame_string, current_frame);

3)另外,如果您希望它更干净一点,请在目录中建立一个文件夹(例如:Images),然后将图像存储在该目录中,例如:

frame_string = "Images/Image_" + std::to_string(count + 1) + ".png";

因此,代码可能看起来像这样:

#include <opencv2/opencv.hpp>

int main() {

  cv::VideoCapture cap("RandomVideo.mp4");
  cv::Mat frame;
  std::string frame_string;
  int count = 0;

  while (true) {
      cap.read(frame);

      // When frame is empty, break the while loop
      if (frame.empty())
        break;

      // Display frame
      cv::imshow("Original", frame);

      // Write frame
      frame_string = "Image_" + std::to_string(count + 1) + ".png";
      cv::imwrite(frame_string, frame);

      // Show current frame in console
      std::cout << "Current frame: " << count << std::endl;

      count++;
      cv::waitKey(1);   // Short delay
  }
}

希望有帮助。