学习视频为:https://www.bilibili.com/video/BV1i54y1m7tw?p=3.
使用imwrite的时候的注意点:
1、路径保存时的路径分隔符为 '/'
2、保存时必须指明保存路径的绝对地址以及保存的文件名是什么,否则会出现异常。
程序代码如下:
02_opencv_cvtColor_imwrite.h
#include <opencv2/opencv.hpp>
using namespace cv;
//可以指定为其他格式,并且可以正常转换
#define gray_save_path "F:/桌面文件/Temporary_code/c++/opencvdemo/OpenMVDemo/gray.jpeg"
#define hsv_save_path "F:/桌面文件/Temporary_code/c++/opencvdemo/OpenMVDemo/hsv.jpeg"
class QuickDemo {
public:
void colorSpace_Demo(Mat& image);
};
02_opencv_cvtColor_imwrite.cpp
#include "02_opencv_cvtColor_imwrite.h"
void QuickDemo::colorSpace_Demo(Mat& image)
{
Mat gray, hsv;
//转HSV颜色模型
cvtColor(image,hsv,COLOR_BGR2HSV);
//H 0--180
//S 0--255
//V 0--255
//转灰度格式
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("HSV", hsv);
imshow("灰度", gray);
//将图像保存到指定路径下
imwrite(hsv_save_path,hsv);
imwrite(gray_save_path, gray);
}
main.cpp
#include <iostream>
#include "02_opencv_cvtColor_imwrite.h"
using namespace std;
int main(int argc,char** argv)
{
//使用Mat(matrix -- 矩阵)这种类型来读取通过指定路径的图像信息并存放到变量picture中。
//图像从本质上来说都是二维的数组(矩阵)
Mat picture = imread("test.jpeg", IMREAD_COLOR);
if (picture.empty())
{
cout << "could not Load image." << endl;
system("pause");
return -1;
}
// namedWindow("输入窗口",WINDOW_FREERATIO);
imshow("输入窗口", picture);
QuickDemo qd;
qd.colorSpace_Demo(picture);
waitKey(0);
destroyAllWindows();
system("pause");
return 0;
}
程序运行结果如下:
关于imwrite第三个参数的深究
图像格式是基于(输出图像)文件扩展名的,如果不对应(你想输出为jpeg图像,但你压缩格式设置为针对png的),将直接忽略设定值,采用默认值。
为了测试imwrite的第三个参数,修改了02_opencv_cvtColor_imwrite.c的程序,一些注释也在程序中标明。
#include <iostream>
#include "02_opencv_cvtColor_imwrite.h"
using namespace std;
void QuickDemo::colorSpace_Demo(Mat& image)
{
Mat gray, hsv;
vector<int> compression_params;
compression_params.push_back(IMWRITE_JPEG_QUALITY);
compression_params.push_back(95);
//RGB颜色模型转HSV颜色模型
cvtColor(image,hsv,COLOR_BGR2HSV);
//H 0--180
//S 0--255
//V 0--255
//RGB颜色模型转灰度模型
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("HSV", hsv);
imshow("灰度", gray);
//将图像保存到指定路径下
imwrite(hsv_save_path,hsv, compression_params);
/*
bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
filename -- 文件路径+文件名
img -- 要报存那个图像
params -- 为特定图像格式保存的参数编码(通过来压缩系数来控制质量)
保存的图像格式是基于(输出图像)文件扩展名的,
可保存的扩展名和imread中可以读取的图像扩展名一样,为了方便查看,我们在这里再列一遍:
一般情况下不需要填写。而如果要填写的话,有下面这些需要了解的地方:
特定格式的保存参数编码成对paramId_1, paramValue_1, paramId_2, paramValue_2, ... .目前支持以下参数:
对于JPEG,它可以是从0到100的质量(CV_IMWRITE_JPEG_QUALITY)(越高越好)。默认值为95。
对于PNG,它可以是压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0到9。数值越大,压缩时间越长,越低越好(经过测试和思考)。缺省值为3。
对于PPM、PGM或PBM,它可以是二进制格式标志(CV_IMWRITE_PXM_BINARY)、0或1。默认值为1。
*/
imwrite(gray_save_path, gray, compression_params);
}
压缩后保存的图像质量好坏可以通过输出的图像文件大小来进行判别。