OpenCV  4.10.0
开源计算机视觉库
加载中...
搜索中...
无匹配项
samples/cpp/tutorial_code/videoio/video-write/video-write.cpp

查看 相应的教程 获取更多详细信息

#include <iostream> // 标准输入输出
#include <string> // 字符串
#include <opencv2/core.hpp> // 基本 OpenCV 结构体 (cv::Mat)
#include <opencv2/videoio.hpp> // 视频写入
using namespace std;
using namespace cv;
static void help()
{
cout
<< "------------------------------------------------------------------------------" << endl
<< "本程序演示如何写入视频文件。" << endl
<< "您可以提取输入视频的 R、G 或 B 颜色通道。" << endl
<< "用法:" << endl
<< "./video-write <输入视频名称> [ R | G | B] [Y | N]" << endl
<< "------------------------------------------------------------------------------" << endl
<< endl;
}
int main(int argc, char *argv[])
{
help();
if (argc != 4)
{
cout << "参数不足" << endl;
return -1;
}
const string source = argv[1]; // 源文件名
const bool askOutputType = argv[3][0] =='Y'; // 如果为 false,则使用输入的编解码器类型
VideoCapture inputVideo(source); // 打开输入
if (!inputVideo.isOpened())
{
cout << "无法打开输入视频: " << source << endl;
return -1;
}
string::size_type pAt = source.find_last_of('.'); // 查找扩展名点
const string NAME = source.substr(0, pAt) + argv[2][0] + ".avi"; // 使用容器形成新名称
int ex = static_cast<int>(inputVideo.get(CAP_PROP_FOURCC)); // 获取编解码器类型 - 整数形式
// 从整数到字符的转换,通过按位运算符
char EXT[] = {(char)(ex & 0XFF) , (char)((ex & 0XFF00) >> 8),(char)((ex & 0XFF0000) >> 16),(char)((ex & 0XFF000000) >> 24), 0};
Size S = Size((int) inputVideo.get(CAP_PROP_FRAME_WIDTH), // 获取输入大小
(int) inputVideo.get(CAP_PROP_FRAME_HEIGHT));
VideoWriter outputVideo; // 打开输出
if (askOutputType)
outputVideo.open(NAME, ex=-1, inputVideo.get(CAP_PROP_FPS), S, true);
else
outputVideo.open(NAME, ex, inputVideo.get(CAP_PROP_FPS), S, true);
if (!outputVideo.isOpened())
{
cout << "无法打开输出视频进行写入: " << source << endl;
return -1;
}
cout << "输入帧分辨率: 宽度=" << S.width << " 高度=" << S.height
<< " 的数量: " << inputVideo.get(CAP_PROP_FRAME_COUNT) << endl;
cout << "输入编解码器类型: " << EXT << endl;
int channel = 2; // 选择要保存的通道
switch(argv[2][0])
{
case 'R' : channel = 2; break;
case 'G' : channel = 1; break;
case 'B' : channel = 0; break;
}
Mat src, res;
vector<Mat> spl;
for(;;) // 在窗口中显示捕获的图像并重复
{
inputVideo >> src; // 读取
if (src.empty()) break; // 检查是否到达末尾
split(src, spl); // 处理 - 仅提取正确的通道
for (int i =0; i < 3; ++i)
if (i != channel)
spl[i] = Mat::zeros(S, spl[0].type());
merge(spl, res);
//outputVideo.write(res); //保存或
outputVideo << res;
}
cout << "写入完成" << endl;
return 0;
}
n 维密集数组类
定义 mat.hpp:812
用于指定图像或矩形大小的模板类。
定义 types.hpp:335
_Tp height
高度
定义 types.hpp:363
_Tp width
宽度
定义 types.hpp:362
用于从视频文件、图像序列或摄像头捕获视频的类。
定义 videoio.hpp:731
视频写入器类。
定义 videoio.hpp:1009
virtual bool open(const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)
初始化或重新初始化视频写入器。
virtual bool isOpened() const
如果视频写入器已成功初始化,则返回 true。
void split(const Mat &src, Mat *mvbegin)
将多通道数组划分为多个单通道数组。
void merge(const Mat *mv, size_t count, OutputArray dst)
从多个单通道数组创建一个多通道数组。
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
与磁盘上的文件关联的文件存储的“黑盒”表示。
定义 core.hpp:102
STL 命名空间。