文章目录
视频读取 cv::VideoCapture
1. 从视频文件读取
cv::VideoCapture capture(
const string& filename, // 输入文件名
);
对象创建以后,OpenCV将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。
2. 从视频设备获取
cv::VideoCapture capture(
int device // 视频捕捉设备 id
);
是从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。
对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。
3. 通过成员函数open()来设定打开的信息
cv::VideoCapture cap;
cap.open( "my_video.avi" );
4. 视频帧读取到Mat
cv::Mat frame;
cap.read(frame); //读取方式一
cap >> frame; //读取方式二
视频的写操作cv::VideoWriter
1. 创建对象
方式一:构造函数的方式
cv::VideoWriter out(
const string& filename, // 输入文件名
int fourcc, // 编码形式,使用 CV_FOURCC()宏
double fps, // 输出视频帧率
cv::Size frame_size, // 单帧图片的大小
bool is_color = true // 如果是false,可传入灰度图像
);
//常用编码形式:MJPG(.mp4),DIVX(.avi),X264(.mkv)
方式二:open()函数
cv::VideoWriter out;
out.open(
"my_video.mpg", // 输出文件名
CV_FOURCC('D','I','V','X'), // MPEG-4 编码
30.0, // 帧率 (FPS)
cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
true // 只输入彩色图
);
2. 写入图像
方式一:write()
cv::VideoWriter::write(
const Mat& image // 写入图像作为下一帧
);
方式二: <<
my_video_writer << my_frame;
DEMO
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
printf("open video failed!\n");
return 1;
}
cv::Mat Frame;
//设置保存的视频帧数目
int frameNum = 1000;
//保存视频的路径
string outputVideoPath = "..\\test.avi";
//获取当前摄像头的视频信息
cv::Size sWH = cv::Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),(int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));
cout << "width :" << (int)cap.get(CV_CAP_PROP_FRAME_WIDTH) << "----" << "height :" << (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT) << endl;
cv::VideoWriter outputVideo;
outputVideo.open(outputVideoPath, -1/*CV_FOURCC('M', 'P', '4', '2')*/, 25.0, sWH);
while (cap.isOpened() && frameNum > 0)
{
cap >> Frame;
if (Frame.empty()) break;
outputVideo << Frame;
frameNum--;
imshow("img", Frame);
//cv::waitKey(10);
if (char(cv::waitKey(30)) == 'q') break;
}
outputVideo.release();
system("pause");
}
DEMO (opencv 4)
#include<iostream>
#include<opencv2/opencv.hpp>
int main() {
cv::VideoCapture capture;
//capture.open(0, cv::CAP_DSHOW);// 打开摄像头
capture.open("./video/1.mp4");// 打开文件
if (!capture.isOpened()) {
printf("read video file failed !\n");
return -1;
}
int type = static_cast<int>(capture.get(cv::CAP_PROP_FOURCC));
cv::Size S = cv::Size((int)capture.get(cv::CAP_PROP_FRAME_WIDTH), (int)capture.get(cv::CAP_PROP_FRAME_HEIGHT));
int fps = capture.get(cv::CAP_PROP_FPS);
printf("FPS: %d \n", fps);
cv::VideoWriter out("./video/test.mp4", type, fps, S, true);
cv::Mat frame;
cv::namedWindow("src", cv::WINDOW_NORMAL);
while (capture.read(frame)) {
imshow("src", frame);
out.write(frame);
char c = cv::waitKey(50);
//按 ESC 键退出播放
if (c == 27) {
break;
}
}
capture.release();
out.release();
return 0;
}