- 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
- 💟 作 者:锡兰_CC ❣️
- 📝 专 栏:【OpenCV • c++】计算机视觉
- 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪
文章目录
- 前言
- 一、什么是 Mat 类
- 二、Mat 类的常见构造方式
- 三、读取图像并显示保存
- 1、读取图像
- 2、显示图像
- 3、存储图像
- 四、代码演示
前言
在计算器内存中,数字图像是以矩阵的形式保存的,矩阵信息中包含了所有像素点的强度值,如何获取并储存这些像素值可根据实际场景应用来确定。在计算机处理中所有图像信息都将转化为数值信息矩阵。
OpenCV
作为计算机视觉处理库,其主要目的就是通过处理和操作这些矩阵信息来获得更加高级的信息。在处理图像中,我们通常使用OpenCV
中最基础的库类Mat
类来对图像进行操作。
一、什么是 Mat 类
Mat
类由矩阵头和指向存储所有像素值的矩阵的指针构成。Mat
类表示一个n
维的密集数值单通道或多通道数据,它可以用于储存实数或负数值的向量和矩阵,灰度或彩色图像,体素,向量场,点云,张量,直方图等。
矩阵头包含矩阵的尺寸、存储方法、地址和引用次数。矩阵头是一个常数,绝大数情况下,矩阵头的大小远小于矩阵数据量的大小。
Mat
类如下所示:
class CV_EXPORTS Mat {public :int flags; //标志位int dims; //数组的维数 >= 2 int rows,cols; //行和列的数量 uchar *data; //指向数据的指针int * refcount; //指针的引用计数器,当阵列指向用户分配的数据时指针为 NULL
};
二、Mat 类的常见构造方式
构造mat
类相当于构造了一个矩阵(数组),一般需要四个基本要素,行数(高),列数(宽),通道数以及数据类型。
Mat
类常见的的构造方式如下:
- Mat :: Mat()
//无参数构造方法 - Mat :: Mat(int rows,int cols,int type)
//创建行数为 rows,列数为 cols,类型为type 的图像 - Mat :: Mat(Size size, int type)
//创建大小为 size,类型为 type 的图像 - Mat :: Mat(int rows,int cols,int type,const Scalar& s);
//创建行数为 rows,列数为 cols,类型为type 的图像,并将所有元素初始化为 s - Mat :: Mat(Size size, int type,const Scalar& s)
//创建大小为 size,类型为 type 的图像,并将所有元素初始化为 s - Mat :: Mat(const Mat& m)
//将 m 赋值给新的对象,m 和新对象共用图像数据。
三、读取图像并显示保存
1、读取图像
OpenCV
使用函数imread
来读取图像。
void cv::imread(const String &filename, OutputArray dst, int flags = IMREAD_COLOR)
其中,参数filename表示读取文件的地址,dst表示将在其中加载图像的对象。flags表示读取图像的颜色类型,默认为1。
2、显示图像
OpenCV
使用函数imshow
来读取图像。
void cv::imshow(const String &winname, InputArray mat)
其中,参数winname表示突破窗口的名字, mat表示显示图像。
在使用函数imshow
之后应调用cv::waitKey,否则,它将不会显示图像。例如,waitKey(0) 将无限显示窗口,直到按下任何一个键(适用于图像显示)。waitKey(25) 将显示一帧并等待大约25ms的按键(适合逐帧显示视频)。要关闭该窗口,可以使用cv::destroyWindow()。
3、存储图像
OpenCV
使用函数imwrite
来读取图像。
bool cv::imwrite(const String & filename, InputArray img, const std::vector<int> & params = std::vector<int>())
其中,参数filename表示写入文件的格式以及文件拓展名,img表示待写入图像,params表示文件格式信息。
四、代码演示
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/types_c.h>
using namespace cv;
using namespace std;
int main() {Mat srcImage = imread("..\\cc.jpg");if (!srcImage.data)return 1;imshow("srcImage", srcImage);imwrite("cc.png", srcImage);waitKey(0);return 0;
}
其他:
更多专栏订阅推荐:
- 👍 【开卷数据结构】
- 💛 【备战蓝桥,冲击省一】
- 💕 从零开始的 c++ 之旅
- 💖 【OpenCV • c++】计算机视觉