目录
1.imread的定义
在OPENCV中常用imread去读取图片信息,下面我们来看看imread的定义.
Mat imread( const String& filename, int flags = IMREAD_COLOR );
第一个参数:filename图片的名称,名称可以是绝对路径也可以是相对路径
第二个参数:flags标识符,flags标识符默认为IMREAD_COLOR。
返回值:Mat矩阵
flags一般分为三种:
- IMREAD_UNCHANGED(<O)按原样加载图像(包括alpha通道(如果存在)
- IMREAD_GRAYSCALE(0)将图像作为强度加载
- IMREAD_COLOR(>0)以RGB格式加载图像
2.imread读取图片并输出图片属性
2.1.imread读取三通道的彩色图像
本章节主要是讲解如何通过代码去实现OPENCV读取图片,并且输出它的图片信息,下面是具体的代码实现:
Mat img_mat = imread("frame1.jpg");
printf("width = %d, height = %d, channels = %d \n", img_ mat.cols, img_ mat.rows, img_mat.channels());
输出结果:width =1920, height =1080, channels =3
2.2.imread读取单通道的灰度图像
Mat img_mat_gray = imread("gray_framel.jpg", IMREAD_GRAYSCALE);
printf( "img_mat_gray_width = %d, img_mat_gray_height = %d, img_mat_gray_channels = %dln", iimg_mat_gray_.cols,img_mat_gray.rows, img_mat_gray.channels());
输出的结果: img_mat_gray_width = 1920, img_ mat_gray_height = 1080, img_mat_gray_chahnels = 1
3.imwrite的定义
在OPENCv中常用 imwrite 去保存图片,下面我们来看看imwrite的定义.
bool imwrite(const Strings filename, InputArray image, const std::vector<int>& params);
第一个传参:filenamme表示要保存的文件名
第二个传参:image表示需要保存的图像数据
第三个传参:paramns保存图像可选参数,主要是设置图像的质量,设置规则具体的我们来看看,该参数需要按照参数id+参数值成对出现,可以出现多对参数值(比如(paramId_1,paramValue_1,paramId_2,paramValue_2,...)),但必须保证这些参数对是相关的,比如保存JPG图像时,只能使用和JPEG相关的参数ID进行组合使用。
paramns的ID基本上是cv::ImwriteFlags.下面我们来看看ImwriteFlags的定义:
- cv::IMWRITE_JPEG_QUALITY:设置JPEG图像的质量,范围为0到100,数值越高质量越好,但文件大小也会相应增加。
- CV::IMWRITE_PNG_COMPRESSION:设置PNG图像的压缩级别,范围为0(无压缩)到9(最大压缩),数值越小压缩率越高,但文件大小也会相应增加。
- CV::IMWRITE_PXM_BINARY:将PXM图像保存为二进制格式,不进行任何压缩。
4.代码实现imwrite保存图片
4.1.使用默认的方式imwrite保存图片
Mat mat = Mat(300,300,CV_8UC3,Scalar(218,112,214));
imwrite("mat_demo.jpg",mat);
上面是使用默认的方法保存图片,这种方法的所有参数都是默认选项。
4.2.使用 params 的方式 imwrite 保存图片
Mat quality_framel_mat = imread("framel.jpg");
std::vector<int> params = {cv::IMWRITE_JPEG_QUALITY, 40};
imwrite("quality_mat_demo.jpg", quality_frame1_mat, params);
这种方法使用的是params参数的方式去设置,上面我们设置了图像的质量在40,大家如果想设置其他功能可以参考上面的枚举进行设置。经过编码质量40的处理后的图像大小小于原图像大小,这说明编码质量关乎着文件的大小和画面的质量
cs
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv; //Must Need Write cv
using namespace std;
int main()
{
Mat mat = Mat(300,300,CV_8UC3,Scalar(218,112,214));
imwrite("file1.jpg",mat);
Mat quality_mat = Mat(300,300,CV_8UC1);
vector<int> params = {cv::IMWRITE_JPEG_QUALITY,40};
imwrite("file2.jpg",quality_mat,params);
Mat img_mat = imread("file1.jpg");
printf("img_mat.width = %d,img_mat.hight = %d,img_mat.chnale = %d\n",img_mat.cols,img_mat.rows,img_mat.channels());
Mat img_gray_mat = imread("file2.jpg",IMREAD_GRAYSCALE);
printf("img_gray_mat.width = %d,img_gray_mat.height = %d,img_gray_amt.channel = %d\n",img_gray_mat.cols,img_gray_mat.rows,img_gray_mat.channels());
return 0;
}