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

网站备案需要准备什么材料营销云

网站备案需要准备什么材料,营销云,网站设计风格大全,互联网公司图片使用 C/OpenCV 裁剪 MP4 视频 🎬 裁剪视频是视频处理中的一项常见任务,其目的是从原始视频画面中提取一个特定的矩形区域,生成一个新的视频。使用 C 和 OpenCV,我们可以逐帧处理视频,实现精确的裁剪。 其核心思路是将…

使用 C++/OpenCV 裁剪 MP4 视频 🎬

裁剪视频是视频处理中的一项常见任务,其目的是从原始视频画面中提取一个特定的矩形区域,生成一个新的视频。使用 C++ 和 OpenCV,我们可以逐帧处理视频,实现精确的裁剪。

其核心思路是将视频看作是连续的图片序列。我们只需读取视频的每一帧,对该帧图片进行裁剪,然后将裁剪后的图片写入一个新的视频文件即可。


主要步骤

  1. 打开视频文件:使用 cv::VideoCapture 对象读取输入的 MP4 文件。
  2. 获取视频属性:从原视频中获取帧率 (FPS)、帧尺寸、编码格式等信息,用于配置输出视频。
  3. 创建视频写入器:使用 cv::VideoWriter 对象,并根据上一步获取的属性(但使用新的、裁剪后的帧尺寸)来创建一个新的 MP4 文件。
  4. 定义裁剪区域:创建一个 cv::Rect 对象,定义需要裁剪的区域。
  5. 逐帧处理:循环读取原视频的每一帧,使用 cv::Rect 对当前帧进行裁剪,然后将裁剪后的小尺寸帧写入新的视频文件。
  6. 释放资源:处理完成后,释放视频读取和写入对象。

C++ 完整代码示例

下面的代码演示了如何加载一个 MP4 文件,对其进行中心区域裁剪,并保存为新文件。

#include <iostream>
#include <opencv2/opencv.hpp>int main() {// 1. 打开视频文件std::string inputPath = "input.mp4"; // 替换成你的视频路径cv::VideoCapture cap(inputPath);if (!cap.isOpened()) {std::cout << "错误: 无法打开视频文件 " << inputPath << std::endl;return -1;}// 2. 获取原视频属性int frame_width = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_WIDTH));int frame_height = static_cast<int>(cap.get(cv::CAP_PROP_FRAME_HEIGHT));double fps = cap.get(cv::CAP_PROP_FPS);int fourcc = static_cast<int>(cap.get(cv::CAP_PROP_FOURCC)); // 获取编码格式std::cout << "原视频 - 尺寸: " << frame_width << "x" << frame_height << ", FPS: " << fps << std::endl;// 3. 定义裁剪区域 (例如,裁剪出一个 640x480 的区域)int crop_width = 640;int crop_height = 480;// 计算左上角坐标,使其居中裁剪int x = (frame_width - crop_width) / 2;int y = (frame_height - crop_height) / 2;cv::Rect crop_region(x, y, crop_width, crop_height);// 确保裁剪区域有效if (x < 0 || y < 0 || x + crop_width > frame_width || y + crop_height > frame_height) {std::cout << "错误: 裁剪区域超出了原视频范围。" << std::endl;return -1;}// 4. 创建视频写入器std::string outputPath = "output_cropped.mp4";cv::VideoWriter writer(outputPath, fourcc, fps, cv::Size(crop_width, crop_height));if (!writer.isOpened()) {std::cout << "错误: 无法创建视频写入器 " << outputPath << std::endl;return -1;}std::cout << "开始处理视频..." << std::endl;// 5. 逐帧处理cv::Mat frame;while (cap.read(frame)) {// 如果帧为空,则跳出循环if (frame.empty()) {break;}// 对当前帧进行裁剪cv::Mat cropped_frame = frame(crop_region);// 将裁剪后的帧写入新视频writer.write(cropped_frame);}std::cout << "视频处理完成,已保存至 " << outputPath << std::endl;// 6. 释放资源cap.release();writer.release();return 0;
}

代码解析

  • cv::VideoCapture cap(inputPath);
    创建一个视频捕获对象,并尝试打开指定的视频文件。isOpened() 方法可以检查是否成功打开。

  • cap.get(...)
    此方法用于获取视频的各种属性,如 CAP_PROP_FRAME_WIDTH(宽度)、CAP_PROP_FPS(帧率)等。我们必须获取这些信息以正确配置输出视频,否则可能导致播放速度异常或文件损坏。

  • cv::VideoWriter writer(...)
    这是创建视频写入器的关键。它需要几个核心参数:

    • 输出文件名: outputPath
    • 编码格式 (FourCC): fourcc。我们直接使用从原视频中读取的编码格式。FourCC 是一个4字节的代码,用于唯一标识视频编解码器。
    • 帧率 (FPS): fps。保持与原视频一致。
    • 帧尺寸: cv::Size(crop_width, crop_height)注意:这里必须使用裁剪后的尺寸,而不是原视频的尺寸。
  • while (cap.read(frame))
    这是一个标准的循环,用于逐一读取视频的每一帧。cap.read(frame) 会读取下一帧并将其存入 frame 这个 Mat 对象中。当视频读取完毕,该函数会返回 false

  • cv::Mat cropped_frame = frame(crop_region);
    这行代码与裁剪单张图片完全相同。它使用 cv::Rect 对象 crop_region 从当前帧 frame 中提取感兴趣的区域。

  • writer.write(cropped_frame);
    将裁剪后的帧 cropped_frame 写入到我们创建的输出视频文件中。

  • cap.release(); writer.release();
    在程序结束时,务必调用 release() 方法来关闭文件并释放相关资源,这是一个良好的编程习惯。


总结

通过 VideoCapture 读取视频、VideoWriter 写入视频以及在循环中对每一帧应用 cv::Rect 裁剪,我们可以用 OpenCV 轻松地实现对 MP4 视频的裁剪。这个流程清晰地展示了视频处理的本质——即对一系列连续图像进行批处理。

http://www.dtcms.com/wzjs/414689.html

相关文章:

  • 广州做响应式网站多少钱百度统计工具
  • 哪家网站开发好网站收录查询站长工具
  • 赤峰市做网站多少钱竞价排名名词解释
  • 怎么做网络直播卖衣服的网站石家庄百度快速排名优化
  • 网站建设案例价格建一个网站大概需要多少钱
  • 网站商城前台模板免费下载佛山做优化的公司
  • 制作视频模板的软件淘宝关键词怎么优化
  • 哔哩哔哩网站电子商务建设网站制作的流程
  • 技术支持 优府网络太原网站建设百度手机怎么刷排名多少钱
  • 建设银行 杭州市公积金管理中心网站网站技术外包公司
  • 汉口做网站的公司最近三天的新闻大事
  • 嘉兴市南湖区建设局网站湖州网站建设制作
  • 自己做网站要多少钱网站查询平台
  • 咖啡网站建设it培训机构
  • 泰州哪家网做网站一个产品的宣传和推广方案
  • 企业crm系统成都优化网站哪家公司好
  • 轻淘客cms建站教程新网站快速排名软件
  • 如何导入wordpress沈阳沈河seo网站排名优化
  • 微信小程序模板网站软件排名工具
  • discuz导入wordpress长沙seo优化服务
  • 上市公司网站分析百度网址安全中心
  • 汕头建站免费模板网站搜索排名优化软件
  • 六安市网站制作百度营业执照怎么办理
  • 现在.net做网站的多吗百度一对一解答
  • 海南公司网站建设合肥网站制作推广
  • 网站建设公司主营业务网站交易平台
  • 广州市最新防疫情百度竞价推广账户优化
  • 厦门市网站建设网站制作方案
  • mysql 视频网站开发成人电脑培训班办公软件
  • 西安网站建设 中讯创赢东莞疫情最新消息今天新增