OpenCV读取视频的原理其实就是不停的拍照,不停的写入到一个文件。
视频本身也是由一张一张照片组成的
代码如下:
#include <opencv2/opencv.hpp> #include <iostream> #include<filesystem> int main() { //视频保存位置(不支持avi格式) std::string outputVideoPath = "video/test.mp4"; //打开摄像头 cv::VideoCapture capture0(0); cv::VideoWriter outputVideo; //获取当前摄像头的视频信息 cv::Size S = cv::Size((int)capture0.get(cv::CAP_PROP_FRAME_WIDTH), (int)capture0.get(cv::CAP_PROP_FRAME_HEIGHT)); //打开视频路劲,设置基本信息 open函数中你参数跟上面给出的VideoWriter函数是一样的 outputVideo.open(outputVideoPath, -1, 60.0, S, true); if (!outputVideo.isOpened()) { std::cout << "fail to open!" << std::endl; return -1; } cv::Mat frameImage; int count = 0; while (true) { //读取当前帧 capture0 >> frameImage; if (frameImage.empty()) break; ++count; //输出当前帧 cv::imshow("output", frameImage); //保存当前帧,不停的写入到(test.mp4)文件 outputVideo << frameImage; if (char(cv::waitKey(1)) == 'q') break; } std::cout << "TotalFrame: " << count << std::endl; }
我们需要注意两个cv::VideoCapture对象的使用,分别是用来读取和写入。最后在while循环中不停的运行,直到我们输入q的时候就会退出,视频录制也就完成了
再介绍一下OpenCV播放视频
#include <iostream> #include<opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include <opencv2/core/utils/logger.hpp> int main() { cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_ERROR); //打开视频文件 cv::VideoCapture capture("./video/蕾姆海边.mp4"); //isOpen判断视频是否打开成功 if (!capture.isOpened()) { std::cerr << "Movie open Error\n"; return -1; } //获取视频帧频 double rate = capture.get(cv::CAP_PROP_FPS); std::cout << "帧率为:" << " " << rate << std::endl; std::cout << "总帧数为:" << " " << capture.get(cv::CAP_PROP_FRAME_COUNT) << std::endl;//输出帧总数 cv::Mat frame; cv::namedWindow("Movie Player"); //设置从第多少帧开始播放 capture.set(cv::CAP_PROP_POS_FRAMES, 0.0); while (true) { //读取视频帧 if (!capture.read(frame)) break; //显示读取到的视频帧同时设置一帧显示多少毫秒 cv::imshow("Movie Player", frame); cv::waitKey(33.3); } capture.release(); //对于视频需要手动关闭 cv::destroyWindow("Movie Player"); }
设置帧率太高的话可能会有点卡,应该取决于电脑硬件
OpenCV C++录制视频录制与播放
最新推荐文章于 2024-04-02 11:48:05 发布