一、函数介绍:
(1)imwrite
:
imwrite
函数是 OpenCV 库中用于将图像保存到文件的函数。
(2)函数原型:
CV_EXPORTS_W bool imwrite(const String& filename, InputArray img,const std::vector<int>& params = std::vector<int>());
(3)参数:
filename
:要保存到的文件的名称。文件格式通常由文件扩展名决定(例如,.jpg
表示 JPEG 格式)。img
:要保存的图像或图像数组。可以是cv::Mat
类型或std::vector<cv::Mat>
类型的容器。params
(可选):特定格式的参数列表,以(paramId_1, paramValue_1, paramId_2, paramValue_2, ...)
的形式编码。这些参数可以控制编码器的行为,例如质量、压缩等。如果未指定,将使用默认值。
二、示例代码
#include <opencv2/core/utils/logger.hpp>//隐藏日志
#include <opencv2/highgui/highgui_c.h>
#include<opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/objdetect.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//3-OPENCV读取图片显示并转化为灰度图显示
int main() //int main(int argc, char** argv)
{
utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);// 设置日志级别为不输出任何日志信息(通过隐藏日志的方式,不打印此信息)
Mat srcMat = imread("C:\\Users\\86173\\Desktop\\TI\\Q版阿离.png");//读入原始图片
Mat gryMat = imread("C:\\Users\\86173\\Desktop\\TI\\Q版阿离.png", 0);//读入原始图片,加参数0,表示读入,并转换成灰度图
cout << "empty:" << (srcMat.empty() ? "the Mat is empty,fail to read" : "not empty") << endl;
if (srcMat.empty())return -1;
imwrite("C:\\Users\\86173\\Desktop\\TI\\gray-butterfly.jpg", gryMat);//保存图片
//namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);//不使用该函数则窗口为默认配置
cout << "rows(列数):" << srcMat.rows << " " << gryMat.rows << endl;//行数
cout << "cols(行数):" << srcMat.cols << " " << gryMat.cols << endl;//列数
cout << "dims(维度):" << srcMat.dims << " " << gryMat.dims << endl;//维度,普通图片为2维
// Size是OpenCV内部定义的数据类型
cout << "size[](宽度*高度):" << srcMat.size().width << "*" << srcMat.size().height << " " << gryMat.size().width << "*" << gryMat.size().height << endl;
cout << "depth (深度ID):" << srcMat.depth() << " " << gryMat.depth() << endl;
// channel数,如灰度图为单通道,RGB图为3通道
cout << "channels(通道):" << srcMat.channels() << " " << gryMat.channels() << endl;
//即elemSize==字节数x通道数;矩阵一个元素占用的字节数
cout << "elemSize(一个元素占用的字节数):" << srcMat.elemSize() << "[byte]" << " " << gryMat.elemSize() << "[byte]" << endl;
// Mat中一个元素的一个通道的size(byte数),矩阵元素一个通道占用的字节数
//eleSize1==elemSize/channels;
cout << "elemSize1 (一个通道占用的字节数):" << srcMat.elemSize1() << "[byte]" << " " << gryMat.elemSize1() << "[byte]" << endl;
//元素的总数,如果是图像,即为像素个数
cout << "total(像素个数):" << srcMat.total() << " " << gryMat.total() << endl;
//cols*elemSize=cols*eleSize1*channels ,每一行中所有元素的字节总量
cout << "step(每一行中所有元素的字节总量):" << srcMat.step << "[byte]" << " " << gryMat.step << "[byte]" << endl;
// 一个step的channel总数,每行的channel数
cout << "step1 (每行的通道数):" << srcMat.step1() << " " << gryMat.step1() << endl;
// 该Mat在内存上是否连续
cout << "isContinuous(该Mat在内存上是否连续):" << (srcMat.isContinuous() ? "true" : "false") << " " << (gryMat.isContinuous() ? "true" : "false") << endl;
cout << "isSubmatrix(是否为子矩阵):" << (srcMat.isSubmatrix() ? "true" : "false") << " " << (gryMat.isSubmatrix() ? "true" : "false") << endl;// 是否为子矩阵
imshow("src", srcMat); //显示原始图片
imshow("gray", gryMat);//显示灰度图片
waitKey(0);//显示图片,必须要加waitKey(),否则无法显示图像
//关闭所有窗口
destroyAllWindows();
return 0;
}