文章目录
- 前言
- 一、常用函数
- 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类
(一)、基本介绍
- cv::Mat 类是用来存放图像(以及其他矩阵数据)的数据结构;
- cv::Mat有两个部分:一个头部,和一个 数据块;
- 头部包含了图像矩阵的所有相关信息(大小、通道数量、数据类型等),还有一个指向数据块的指针,data属性;
- 数据块包含了图像中所有像素的值。
【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_类
(一)、基本介绍
- 是cv::Mat类的子类;
- 如果已经知道(图像)矩阵的类型,就可以使用cv::Mat_ 类;
- 该类定义了一些新的方法,但没有定义新的数据属性,因此这两个类的指针或引用可以直接互相转换。
//定义一个矩阵
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列处的像素值
(二)、优势
- 访问像素值的代码更简洁。
总结
以上就是今天要讲的全部内容,详细的参数介绍均可见官方文档。