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

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函