python - 如何进行视频取景?
问题描述
我想输入一个视频并逐帧保存视频,我使用 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)
解决方案
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;
}
推荐阅读
- angularjs - 如何在图库视图中使用 ng-repeat 堆叠图像?
- oracle - 查询以获取 Oracle 应用程序中的服务合同
- javascript - 在输入文本中设置最小长度会给出重复的警报消息
- c# - 传递表单参数并调用其事件
- swift - xcode swift 4数字增加动画?
- java - 类型 E 被识别为对象
- twitter-bootstrap - Bootstrap 页脚列未对齐
- postgresql - postgresql - 删除模式说模式不存在
- angularjs - 如何在 angularJS 中同时使用页面行函数和脚本函数
- node.js - AWS - MEAN App - 维护上传文件夹