一、打开摄像头
#include <iostream> #include <filesystem> #include <string> #include <windows.h> #include <opencv2/opencv.hpp> namespace fs = std::filesystem; using namespace cv; using namespace std; // 摄像头 void video() { // 读取摄像头 VideoCapture capture(0); while (true) { Mat frame; capture >> frame; imshow("摄像头", frame); waitKey(30); // 延时30 } } int main() { video(); waitKey(0); destroyAllWindows(); return 0; }
二、保存视频
其中fourcc编码格式可选参数如下:
参数 编码格式
MPEG-1 CV_FOURCC(‘P’,‘I’,‘M’,‘1’)
motion-jpeg CV_FOURCC(‘M’,‘J’,‘P’,‘G’)
MPEG-4.2 CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’)
MPEG-4.3 CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’)
MPEG-4 CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’)
H263 CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’)
H263I CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’)
FLV1 CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’)
#include <iostream> #include <filesystem> #include <string> #include <windows.h> #include <opencv2/opencv.hpp> namespace fs = std::filesystem; using namespace cv; using namespace std; // 保存视频 void test_video_save() { VideoCapture capture(0); // 创建VideoCapture类 int frame_width = capture.get(CAP_PROP_FRAME_WIDTH); // 获取摄像头的宽、高 int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT); VideoWriter writer; // 创建VideoWriter类 int fourcc = writer.fourcc('D', 'I', 'V', 'X'); // 定义编码格式 // 保存视频 /* filename, // 文件路径。 fourcc, // 四个字符用来表示压缩帧的codec。 fps, // 被创建视频流的帧率。 frameSize, // 视频流的大小。 isColor = true // True则每一帧为彩色图,否则为灰度图。 */ writer.open("D:/opencv/console/x64/Debug/test.mp4", fourcc, 30, Size(frame_width, frame_height), true); Mat frame; // 定义Mat对象用于存储每一帧数据 while (capture.isOpened()) { capture.read(frame); // 逐帧读取视频 /* src 原图像。 dst 翻转后的图像。 flipCode == 0垂直翻转(沿X轴翻转)。 flipCode > 0水平翻转(沿Y轴翻转)。 flipCode < 0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)。 */ flip(frame, frame, 1); // 将读取的视频左右反转 // 如果视频结束或未检测到摄像头则跳出循环 if (frame.empty()) { break; } writer.write(frame); imshow("Video", frame); // 每次循环显示一帧图像 char k = waitKey(33); // 两帧读取的间隔时间 1s/30fps=33ms // 按下q键退出循环 if (k == 'q') { break; } } capture.release(); // 释放视频 writer.release(); } int main() { // 保存视频 test_video_save(); waitKey(0); destroyAllWindows(); return 0; }
三、读取视频
#include <iostream> #include <filesystem> #include <string> #include <windows.h> #include <opencv2/opencv.hpp> namespace fs = std::filesystem; using namespace cv; using namespace std; // 读取视频 void test_play() { // 读取视频 VideoCapture capture("D:/opencv/console/x64/Debug/test.mp4"); while (true) { Mat frame; capture >> frame; // 判断当前帧是否为空 if (frame.empty()) { break; } imshow("读取视频", frame); waitKey(30); // 延时30ms } } int main() { // 读取视频 test_play(); waitKey(0); destroyAllWindows(); return 0; }