opencv的VideoWriter类及参数用于保存视频

2023-12-28 02:38

本文主要是介绍opencv的VideoWriter类及参数用于保存视频,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VideoWriter

  • 说明
  • 参数
  • 例子
    • 例一:修改视频的分辨率
    • 例二:在视频的指定区域画圆
    • 例三:对彩色图像的每个通道单独进行处理
  • 错误的情况
    • 1.图片的分辨率大小
    • 2.路径

说明

要使用OpenCV保存视频,首先系统要先安装ffmpeg库,以及opencv的库是否正常链接了ffmpeg。OpenCV只支持保存.avi格式的视频,保存的视频目前无法避免被压缩,而且不能添加音频。

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

参数

1、filename 保存输出视屏文件名;
2、fourcc 四个字符用来表示压缩帧的codec,最常用的是CV_FOURCC(‘M’,‘J’,‘P’,‘G’) = motion-jpeg codec,另外也有:
CV_FOURCC(‘P’,‘I’,‘M’,‘1’) MPEG-1 codec
CV_FOURCC(‘M’,‘J’,‘P’,‘G’) motion-jpeg codec (does not work well)
CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) MPEG-4.2 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) MPEG-4.3 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) MPEG-4 codec
CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) H263 codec
CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) H263I codec
CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) FLV1 codec
3、fps保存视屏文件帧率;
4、frameSize视屏文件宽高;
5、isColor设置视屏文件为彩色或者灰度;

需要注意要保存的图片的类型是否为CV_8UC3或者CV_8U,不支持CV_8UC4;

例子

例一:修改视频的分辨率

#include<opencv2/opencv.hpp>
#include<iostream>using namespace std;
using namespace cv;int main()
{VideoCapture capture("./video/left_02.mp4");//获取视频,根据自己的视频位置更改if (!capture.isOpened())return -1;Mat frame;capture.set(CAP_PROP_FRAME_WIDTH, 640);capture.set(CAP_PROP_FRAME_HEIGHT, 480);Mat image;//VideoWriter(const String & filename, int fourcc, double fps,Size frameSize, bool isColor = true);VideoWriter videowriter("./output/result11.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, Size(640, 480), true);   //改变图像的帧速为30,图像帧的大小是(640,480)while (capture.read(image)){imshow("image", image);resize(image, image, Size(640, 480), INTER_LINEAR);videowriter.write(image);waitKey(1);}waitKey();return 0;}

例二:在视频的指定区域画圆

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char **argv)
{cv::Size image_size(640, 480);std::string outputVideoPath = "./image_save.avi";cv::VideoWriter outputVideo;outputVideo.open(outputVideoPath,CV_FOURCC('M', 'P', '4', '2') , 20.0, image_size);   std::vector<string> imagelist;std::cout << std::endl << "---Begin----" << std::endl;for (int ni = 0; ni < imagelist.size(); ni++){// Read images img = cv::imread(imagelist[ni]);// for showcv::putText(img, "(100,100)",cv::Point2f(100,100), 1,1, cv::Scalar(255, 0, 0), 1);cv::circle(img, cv::Point2f(100,100), 2, cv::Scalar(255, 0, 0), 1);outputVideo << img;cv::imshow("img", img);cv::waitKey(1);}img.release();return 0 ;
}

例三:对彩色图像的每个通道单独进行处理

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/opencv.hpp>
#include<iostream>using namespace cv;
using namespace std;int main()
{//cap1是左边镜头,cap2是右边镜头VideoCapture cap1("./video/left_02.mp4");VideoCapture cap2("./video/right_02.mp4");double rate = 60;int delay = 1000 / rate;bool stop(false);Mat frame1;Mat frame2;Mat frame;Point2i a;//存储偏移量VideoWriter videowriter("./output/result222.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, Size(1920, 1080), true);   //改变图像的帧速为30,图像帧的大小是(1920,1080)if (cap1.isOpened() && cap2.isOpened()){cout << "*** ***" << endl;cout << "摄像头已启动!" << endl;}else{cout << "*** ***" << endl;cout << "警告:摄像头打开不成功或者未检测到有两个摄像头!" << endl;cout << "程序结束!" << endl << "*** ***" << endl;return -1;}Mat image, image2;while (!stop){if (cap1.read(frame1) && cap2.read(frame2)){imshow("cam1", frame1);imshow("cam2", frame2);//彩色帧转灰度//cvtColor(frame1, frame1, COLOR_RGB2GRAY);//cvtColor(frame2, frame2, COLOR_RGB2GRAY);//imshow("cvtColor1", frame1);//imshow("cvtColor2", frame2);image = frame1;Mat src = image;Mat res(src.rows, src.cols, CV_8UC3); //用来存储目的图片的矩阵imshow("src", src);//Mat数组来存车分离后的三个通道,每个通道都初始化为0;//matlab 的排列顺序是R,G,B; 而在opencv中,排列顺序是B,G,R。 Mat planes[] = { Mat::zeros(src.size(), CV_8UC1),Mat::zeros(src.size(), CV_8UC1), Mat::zeros(src.size(), CV_8UC1) };//多通道分成3个单通道   split(src, planes);//在OpenCV中,一张3通道图像的一个像素点是按BGR的顺序存储的。,可以通过planes[0],planes[1],planes[2]分别对每一个通道进行处理merge(planes, 1, res);  //通道合并,三通道合并为一个完整的彩色图imshow("name", res);waitKey(1);}}return 0;
}

错误的情况

1.图片的分辨率大小

VideoWriter 定义时候视频的分辨率的大小一定要和我们存储的图片的分辨率的大小一致,否则输出为0k。

2.路径

存储的路径需要为中文

这篇关于opencv的VideoWriter类及参数用于保存视频的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/544893

相关文章

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、