当前位置: 首页 > news >正文

九、OpenCV中视频的录制

文章目录

    • 一、OpenCV 视频录制概述
    • 二、示例代码

一、OpenCV 视频录制概述

在 OpenCV 中,视频录制主要靠 cv::VideoWriter 类。它可以把连续的 cv::Mat 帧写入一个视频文件(如 .avi、.mp4 等)。

VideoWriter类
构造函数:

VideoWriter::VideoWriter(const String &filename,int fourcc,double fps,Size frameSize,bool isColor = true);

参数说明:

  • filename:保存的视频文件名,例如 “output.avi”
  • fourcc:视频编码方式,如 CV_FOURCC(‘M’,‘J’,‘P’,‘G’) 或 VideoWriter::fourcc(‘M’,‘J’,‘P’,‘G’)
  • fps:帧率(帧每秒)
  • frameSize:视频每帧的尺寸,Size(width, height)
  • isColor:是否为彩色视频,true 彩色,false 灰度

常用编码(fourcc):

int fourcc = VideoWriter::fourcc('M','J','P','G'); // AVI 常用
int fourcc_mp4 = VideoWriter::fourcc('a','v','c','1'); // MP4 H264

二、示例代码

示例 1:从摄像头录制视频

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;int main() {VideoCapture cap(0); // 打开摄像头if (!cap.isOpened()) {cout << "Cannot open camera" << endl;return -1;}// 视频参数int frame_width = static_cast<int>(cap.get(CAP_PROP_FRAME_WIDTH));int frame_height = static_cast<int>(cap.get(CAP_PROP_FRAME_HEIGHT));VideoWriter writer("output.avi",VideoWriter::fourcc('M','J','P','G'),30, Size(frame_width, frame_height));Mat frame;while (true) {cap >> frame;if (frame.empty()) break;writer.write(frame); // 写入视频imshow("Camera", frame);if (waitKey(1) == 27) break; // 按 ESC 停止}cap.release();writer.release();destroyAllWindows();return 0;
}

示例 2:将视频文件处理后保存

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;int main() {VideoCapture cap("opencv_demo.mp4");if (!cap.isOpened()) return -1;int width = cap.get(CAP_PROP_FRAME_WIDTH);int height = cap.get(CAP_PROP_FRAME_HEIGHT);VideoWriter writer("output_processed.avi",VideoWriter::fourcc('M', 'J', 'P', 'G'),30, Size(width, height));Mat frame;while (true) {cap >> frame;if (frame.empty()) break;// 处理帧,例如灰度cvtColor(frame, frame, COLOR_BGR2GRAY);cvtColor(frame, frame, COLOR_GRAY2BGR); // 保持三通道以写入writer.write(frame);}cap.release();writer.release();return 0;
}

示例3:自动读取指定文件夹下所有图片生成视频

#include <opencv2/opencv.hpp>
#include <iostream>
#include <filesystem>
#include <vector>
#include <algorithm>
using namespace cv;
using namespace std;
namespace fs = std::filesystem;int main() {string folderPath = "images"; // 图片文件夹路径string outputVideo = "output_video.avi";double fps = 30.0; // 帧率vector<string> imgFiles;// 遍历文件夹,收集图片路径for (const auto& entry : fs::directory_iterator(folderPath)) {if (entry.is_regular_file()) {string ext = entry.path().extension().string();// 支持 jpg/png/bmpif (ext == ".jpg" || ext == ".png" || ext == ".bmp")imgFiles.push_back(entry.path().string());}}if (imgFiles.empty()) {cout << "No images found in folder!" << endl;return -1;}// 按文件名排序sort(imgFiles.begin(), imgFiles.end());// 读取第一张图片获取尺寸Mat firstImg = imread(imgFiles[0]);if (firstImg.empty()) {cout << "Failed to read " << imgFiles[0] << endl;return -1;}Size frameSize(firstImg.cols, firstImg.rows);// 创建 VideoWriterVideoWriter writer(outputVideo,VideoWriter::fourcc('M','J','P','G'),fps,frameSize,true);if (!writer.isOpened()) {cout << "Cannot open VideoWriter!" << endl;return -1;}// 写入每张图片for (const auto& file : imgFiles) {Mat img = imread(file);if (img.empty()) {cout << "Failed to read " << file << endl;continue;}// 尺寸不一致就 resizeif (img.size() != frameSize) {resize(img, img, frameSize);}writer.write(img);}writer.release();cout << "Video saved as " << outputVideo << endl;return 0;
}
http://www.dtcms.com/a/405807.html

相关文章:

  • ASP.NET网站建设实战企业网页模板图片
  • 分布式机器人多机协同巡检系统设计
  • 滑动窗口题目:统计「优美子数组」
  • list 迭代器:C++ 容器封装的 “行为统一” 艺术
  • 专题:2025年AI Agent智能体行业洞察报告|附110+份报告PDF、数据仪表盘汇总下载
  • docker部署使用
  • 信息安全基础知识:05物理与环境安全
  • 【双机位A卷】华为OD笔试之【队列】双机位A-篮球游戏【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
  • 考研复习-线性代数-第二章-矩阵
  • wordpress主题样式表绵阳做seo网站公司
  • Answer+cpolar:企业知识共享的远程协作方案
  • 在SSL证书是有效的前提下,依旧显示“资源不安全
  • 鸿蒙NEXT系统Picker全解析:安全高效的用户资源访问之道
  • Gin + JWT 认证机制详解:构建安全的Go Web应用
  • VS要求的.NET 9 SDK需求、安装注意事项及VS版本搭配
  • SSL证书安全的几个问题
  • 4种安全方法:将一加手机联系人传输到电脑
  • 网站建设盐城北安网站建设
  • Guidde:AI驱动的视频文档创建工具
  • 29.Linux防火墙管理
  • 记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档)
  • DHCP 服务器
  • K8s学习笔记(七) yaml
  • K8S的StorageClass使用节点本地LVM逻辑卷怎么进行PVC扩容
  • 软件开发公司如何通过 UI 设计服务打造差异化竞争力
  • 【源码剖析】5-生产者-RecordAccumulator分析
  • PHP编程基础
  • 单片机 | 基于51单片机的摇摇棒设计全解析
  • 从零开始部署Android环境的Jenkins CI/CD流水线(docker环境,Win系统)
  • HttpSessionBindingListener