前言:纯属个人理解,不喜误喷,也希望大家给点关注支持
正文:
说到opencv对图像的读取、显示与保存,就不得不提到cv2后的一个特殊存在(Mat)和三个api(imread()、imshow()、imwrite())。
首先是Mat,Mat是opencv2版本重新对于图片处理的一个封装类,个人的观感就是这是opencv得到发展的一个重要特点,说到底图片处理在计算机中也就是对于矩阵的处理。
然后是三个api:
一、读取图片的api
cv::Mat src_img = cv::imread(scr, 0);
/*第一个参数
*图片的地址,这里需要注意格式在不同的系统上填写的格式不同
*/
/*第二个参数
* -1 8深度 原通道
* 0 8深度 1通道
* 1 8深度 3通道
* 2 原深度 1通道
* 4 原深度 3通道
* CV_LOAD_IMAGE_ANYDEPTH 返回图像的深度不变 对应 2
* - 如果设置,当输入具有相应深度时返回16位/32位图像,否则将其转换为8位。
*
* CV_LOAD_IMAGE_COLOR 对应 1
* - 如果设置,则始终将图像转换为彩色图像
*
* CV_LOAD_IMAGE_GRAYSCALE 对应 0
* - 如果设置,则始终将图像转换为灰度图像,位深=8bit 通道数=1(颜色变灰)
*
*CV_LOAD_IMAGE_UNCHANGED 对应 -1
* – 在每个通道中,每个像素的位深为8 bit,通道数(颜色)保持不变
*
*CV_LOAD_IMAGE_ANYCOLOR 对应 4
* – 位深不变 , 通道数不变
*
* 组合
* CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR – 位深不变,通道数变 (最真实图像)
*
* CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH – 位深不变,通道数=3(三通道)
*
* 如果输入有冲突的标志,将采用较小的数字值
*/
二、显示图片api
cv::imshow(“显示图片的窗口名”,Mat mat);
/*第一个参数
*图片显示的窗口的名字
*/
/*第二个参数
*属于Mat 类的图像矩阵
*/
重点注意
显示图片还需要在最后加一个方法 waitKey(0);
里面的参数表示显示的时间,
0表示一直显示,但是在某些版本里面为空时一直显示。
三、保存图片api
imwrite( const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
/*第一个参数
*"图片名字.格式";
*第二个参数
*Mat类型的图像数据;
*第三个参数
*特定格式保存的参数编码,所以一般可以不写
*/
最后是一个范例
#include <opencv2/opencv.hpp>
#include <iostream>
//#include <cmath>
using namespace cv;
using namespace std;
int main()
{
try{
Mat img;
img = imread("/home/cxf1/下载/1.jpg");
if (img.empty()){
cout<< "kuai l "<<endl;
return -1;
}
imshow("img", img);
// imwrite("/home/cxf1/img/1-1.jpg",img);
waitKey(0);
return 0;
}catch(Exception e){
cout<<"over"<<endl;
return -1;
}
}
效果