一、图像数据的保存
opencv提供imwrite()函数用于将Mat类矩阵保存成图像文件,该函数的原型如下:
bool cv::imwrite(const String &filename,
InputArray img,
Const std::vector<int> ¶ms = std::vector<int>()
)
filename: 保存图像的地址和文件名,包含图像格式。
img: 将要保存的Mat类矩阵变量。
params: 保存图片格式属性设置标志。
当保存图像成功,返回true,失败则返回false,通常该函数只能保存8位单通道图像和3通道BGR彩色图像,但是可以更改第三个参数保存成不同格式的图像。第三个参数的设置方式如下:
标志参数 | 简记 | 作用 |
IMWRITE_JPEG_QUALITY | 1 | 保存成JPEG格式的文件的图像的质量,分成0~100等级,默认95 |
IMWRITE_JPEG_PROGRESSIVE | 2 | 增强JPEG格式,启用为1,默认值为0(False) |
IMWRTE_JPEG_OPTIMIZE | 3 | 对JPEG格式进行优化,启用为1,默认参数为0(False) |
IMWRITE_JPEG_LUMA_QUALITY | 5 | JPEG格式文件单独的亮度质量等级,分为0~100,默认为0 |
IMWRITE_JPEG_CHROMA_QUALITY | 6 | JPEG格式文件单独的色度质量等级,分成0~100,默认为0 |
IMWRITE_PNG_COMPRESSION | 16 | 保存成PNG格式文件压缩级别,0~9值越大越意味着更小尺寸和更长的压缩时间,默认值为1(最佳速度设置) |
IMWRITE_TIFF_COMPRESSION | 259 | 保存成TIFF格式文件压缩方案 |
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void AlphaMat(Mat &mat)
{
CV_Assert(mat.channels() == 4); //如果括号中的表达式为false则返回一个错误信息
for(int i = 0; i < mat.rows; i++)
{
for(int j = 0; j < mat.cols; j++)
{
Vec4b &bgra = mat.at<Vec4b>(i, j);
bgra[0] = UCHAR_MAX;
bgra[1] = staurate_cast<uchar>((float(mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX;
bgra[2] = staurate_cast<uchar>((float(mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX;
bgra[3] = staurate_cast<uchar>(0.5 * (bgra[1] + bgra[2])) //Alpha通道
}
}
}
int main(int agrc, char** agrv)
{
Mat mat(400, 640, CV_8UC4);
AlphaMat(mat);
vector<int> compression_params;
compression_params.push_back(IMRITE_PNG_COMPRESSION); //PNG格式图像压缩标志
compression_params.push_back(9);
bool result = imwrite("alpha.png", mat, compression_params);
if(!result)
{
cout<<"保存成PNG格式图像"<< endl;
return -1;
}
cout << "保存成功" << endl;
return ;
}
二、视频的保存
OpenCV提供了ViodeWriter()类用于实现多张图像保存成视频文件。函数原型如下:
cv::VideoWriter::VideoWriter(); //默认构造函数
cv::VideoWriter::VidowWriter(const String &filename,
int fourcc,
double fps,
Size framSize,
bool isColor=true
)
filename: 保存视频的地址和文件名,包含视频格式。
fourcc: 压缩帧的4字符编解码器代码。
fps:保存视频的帧率,即视频中每秒图像的张数。
framSize: 视频的尺寸。
isColor: 保存视频是否为彩色视频。
第一行默认构造函数的使用方法与VideoCapture()相同,都是创建一个用于保存视频的数据流,后续通过open()函数设置保存文件名称,编解码器, 帧数等一系列参数。在第二个参数中如果赋值“-1”则会自动搜索合适的编解码器。
该函数与VideoCapture()有很大的相似之处,都可以通过isOpened()函数判断是否成功创建一视频流,可以通过get()查看视频流中的各种属性。在保存视频时我们只需要将生成视频的图像一帧一帧地通过“<<"操作符(或者write()函数)赋值给视频流,最后使用release()关闭视频流。
OpenCV4.1版本标志 | OpenCV4.0版本标志 | 作用 |
VideoWriter::fourcc('D', 'T', 'V', 'X') | VideoWriter::FOURCC('D', 'T', 'V', 'X') | MPEG-4编码 |
VideoWriter::fourcc('P', 'T', 'M', 'I') | ... | MPEG-1编码 |
VideoWriter::fourcc('M', 'J', 'P', 'G') | ... | JPEG编码(运行效果一般 |
VideoWriter::fourcc('M', 'P', '4', '2') | ... | MPEG-4.2编码 |
VideoWriter::fourcc('D', 'T', 'V', '3') | ... | MPEG-4.3编码 |
VideoWriter::fourcc('U', '2', '6', '3') | ... | H263 编码 |
VideoWriter::fourcc('T', '2', '6', '3') | ... | H2631编码 |
VideoWrter::fourcc('F', 'L', 'V', '1' ) | ... | FLVI编码 |
#include <opencv/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img;
VideoCapture video(0); //使用某个摄像头
//读取视频
//VideoCapture video;
//Video.open("cup.mp4");
if(!Video.isOpened()) //判断是否调用成功
{
cout << "打开摄像头失败,请确认摄像头是否安装成功";
return -1;
}
video >> img; //获取图像
//检测是否成功获取图像
if (img.empty()) //判断读取图像是否成功
{
cout <<"没有获取到图像" << endl;
return -1;
}
bool isColor = (img.type() == CV_8UC3); //判断 相机(视频)是否为彩色
VideoWriter writer;
int codec = VideoWriter::fourcc('M', 'J', 'P', 'G'); //选择编码格式
double fps = 25.0; //设置视频帧率
string filename = "live.avi"' //保存的视频文件名称
writer.open(filename, codec, fps, img.size(), isColor); //创建保存视频文件的视频流
if(!writer.isOpened()) //判断视频流是否创建成功
{
cout<<"打开视频流失败,请输入是否为合法输入" <<endl;
return -1;
}
while (1)
{
//检测是否执行完毕
if(!video.read(img)) //判断能否继续从摄像头过着视频文件中读出一帧图像
{
cout<<"摄像头断开链接或者视频读取完成"<<endl;
break;
}
writer.write(img); //把图像写入视频流
//writer << img;
imshow("Live", img); //显示图像
char c = waitKey(50);
if (c == 27) //按“Esc”键退出视频保存'
{
break;
}
}
// 退出程序时自动关闭视频流
// video.release();
// writer.release();
return 0;
}