我想输入视频并逐帧保存视频,我使用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)
答案 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
}
}
希望有帮助。