文章目录

  • 前言
  • 一、常用函数
  • 1. imread()函数
  • 2. imshow()函数
  • 3. imwrite()函数
  • 4. cvtColor()函数
  • 二、cv::Mat 和 cv::Mat_ 类
  • 1.cv::Mat类
  • 2.cv::Mat_类
  • 总结



前言

提示1:总结了OpenCV的装载/显示/存储函数和两个常用的Mat类。
提示2:本文所有API源码定义均来自官方文档 https://docs.opencv.org/4.5.3/


提示:以下是本篇文章正文内容,下面案例可供参考

一、常用函数

提示:以下API需要包含以下头文件

#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;

1. imread()函数

//------------------------------【函数定义】------------------------------
Mat cv::imread	(	
const String & 	filename,         //所需要加载的图像文件名称
int 	flags = IMREAD_COLOR      //加载的flag标识,代表以哪种方式加载
)
	
//------------------------------【参数介绍】------------------------------
//@param -filename
目前Opencv4.5.3支持以下文件格式:
 - .bmp
 - .jpg/.jpeg
 - .jp2
 - .png
 - .webp
 - .pdm./.pgm/.ppm/.pxm/.pnm
 - .pfm
 - .tiff
 - ...

//@param - flags
 - IMREAD_UNCHANGED = -1  //和原图信息保持一致
 - IMREAD_GRAYSCALE = 0  //始终将原图转换至单通道的灰度图像
 - IMTEAD_COLOR = 1      //始终将原图转换至3通道的BGR彩色图像
 - ...
//示例:
//1、 读取本地单张图片——相对路径法(需将图片放进与.cpp源文件同路径下)
cv::Mat image = cv::imread("washington.jpg", 0);
//2、读取本地单张图片——绝对路径法(不建议使用)
string imgPath = "F:/01 工程学习/01 project/repo_test001/OpenCV_TEST002/OpenCV_TEST002/tower.jpg";
cv::Mat image = cv::imread(imgPath, -1);

Tips
(1)使用绝对路径法,注意路径的斜杠均为左斜杠;
(2)实际工程中因为项目工程会在不同平台的迁移运行,不建议使用绝对路径法。

2. imshow()函数

//------------------------------【函数定义】------------------------------
void cv::imshow	(	
const String & 	winname,      //显示窗口的名称
InputArray 	mat               //图像名称
)
//示例:
nameWindow("image", 1);      //定义窗口的名称为“image”,flag标识为“自动大小”
cv::imshow("image", image);

3. imwrite()函数

//------------------------------【函数定义】------------------------------
bool cv::imwrite	(	
const String & 	filename,           //文件名称
InputArray 	img,                    //被存储的图像名称
const std::vector< int > & 	params = std::vector< int >()    //通常缺省
)
//示例:
imwrite("001.jpg", src);     //将目标图像src以名称“001.jpg”进行存储

Tips
你需要什么格式的图片,存储时文件名称就得指定什么后缀名。

4. cvtColor()函数

//------------------------------【函数定义】------------------------------
#include <opencv2/imgproc.hpp>

void cv::cvtColor	(	InputArray 	src,     //输入图像
OutputArray 	dst,                         //输出图像
int 	code,               //转换码标识
int 	dstCn = 0           //通常缺省
)		

//------------------------------【参数介绍】------------------------------
//@param -code
 - COLOR_BGR2GRAY = 6  //将三通道的彩图转换至单通道的灰度图
 - COLOR_GRAY2BGR = 8  //将单通道的灰度图转换至三通道的彩图
 - COLOR_BGR2HSV = 40  //将BGR色彩空间转换成HSV色彩空间
 - COLOR_HSV2BGR = 54  //将HSV色彩空间转换成BGR色彩空间
//示例:
cvtColor(src, dst, 40);     //将BGR彩色空间的源图像src转换成HSV彩色空间的dst图像
imshow("dst", dst);         //在名为“dst”的窗口显示图像dst

Tips
(1)HSV色彩空间的 H(Hue) 代表色调,S(Saturation) 代表饱和度,V(Value) 代表亮度。
(2)色调Hue代表的是:主色;
(3)饱和度Saturation代表的是:颜色的鲜艳程度,柔和的颜色饱和度较低,彩虹的颜色饱和度较高;
(4)亮度Value代表的是:某种颜色的光亮程度,近似于灰度值的强度。

二、cv::Mat 和 cv::Mat_ 类

1.cv::Mat类

(一)、基本介绍

  1. cv::Mat 类是用来存放图像(以及其他矩阵数据)的数据结构;
  2. cv::Mat有两个部分:一个头部,和一个 数据块
  3. 头部包含了图像矩阵的所有相关信息(大小、通道数量、数据类型等),还有一个指向数据块的指针,data属性;
  4. 数据块包含了图像中所有像素的值。

Tips
(1)cv::Mat只有在明确要求时,内存块才会被复制,大多数操作仅仅复制了cv::Mat的头部,因此多个对象会指向同一个数据块,这种内存管理模式可以提高应用程序的运行效率,避免内存泄漏。
(2)同样,在需要修改图像内容时,图像参数没必要采用引用传递的方式。

int main(int argc, char** argv)
	{
		//cv::Mat image(200, 300, CV_8U, cv::Scalar(100));
		cv::Mat image(200, 300, CV_8UC3, cv::Scalar(100, 15, 255));  //创建 200x300 的3通道彩色图像
		//cv::Mat image(cv::Size(300, 200), CV_8UC3, cv::Scalar(100, 15, 255));  //注意width = 300 对应的是列,height = 200对应的是行
		if (!image.data)
		{
			cout << "Could not load image...\n";    //如果图像的data指针为空,则输出“无法加载图像”
			return -1;
		}
		imshow("image", image);

		//图像的浅拷贝
		cv::Mat image1(image);
		cv::Mat image2 = image;
		imshow("image1", image1);
		imshow("image2", image2);

		//图像的深拷贝
		cv::Mat image3, image4;
		image1.copyTo(image3);
		image4 = image1.clone();
		imshow("image3", image3);
		imshow("image4", image4);
	
		waitKey(0);
	}

2.cv::Mat_类

(一)、基本介绍

  1. 是cv::Mat类的子类;
  2. 如果已经知道(图像)矩阵的类型,就可以使用cv::Mat_ 类;
  3. 该类定义了一些新的方法,但没有定义新的数据属性,因此这两个类的指针或引用可以直接互相转换。
//定义一个矩阵
	cv::Mat C = (Mat_<int>(3, 3) << 0, -1, 0, 1, 2, 3, 4, 5, 6);
	cout << "C = " << C << endl;

	//用Mat_模板操作图像
	cv::Mat image = cv::imread("washington.jpg", 0);
	cv::Mat_<uchar> img(image);
	img(50,100) = 0;   //访问第50行、第100列处的像素值

(二)、优势

  1. 访问像素值的代码更简洁。

总结


以上就是今天要讲的全部内容,详细的参数介绍均可见官方文档。