目录
1.Mat类模板相关知识点
- Mat类模板可以用于保存其他n维数组,主要用于保存图像数据,默认情况下,定义的cv::Mat类对象时,其大小为0 x 0(也可以给构造函数提供合适的参数)如:
- cv:Mat img(240,320,CV_8U,cv::Scalar(100))
- 其中CV_8U表示图像中的每个像素用1个字节表示(8bit),U表示无符号整数。
- 对于彩色图像,使用3通道(channels)表示,其中CV_8UC3。
- 也可以使用16位或者32位整型CV_8SC3,32或者64位浮点型CV_32F。
- cv::Mat类对象离开作用域之后,会自动销毁,所以避免了内存泄露。
- cv::Mat类提供了一个引用计数器和浅复制机制以便将一个图像复制给另一个图像,而不是复制其数据,这两个图像会共享同一个数据区,特别是当参数是值传递和函数返回的是图像时。
- 一个引用计数器保证只有当所有的引用都销毁之后才真正销毁数据。
2.创建cv::Mat类对象
| 语法 | 描述 |
| double m[2][2] = {{1.0,2.0},{3.0,4.0}};Mat M(2,2,CV_32F,m) | 根据二维数组m创建一个2 x 2维矩阵M |
| Mat M(100,100,CV_32FC2,Scalar(1,3)) | 创建一个100 x 100的2通道矩阵,第一个通道用1填充,第二个通道使用3填充 |
| M.create(300,300,CV_8UC(15)) | 创建一个300 x 300的15通道矩阵 |
| int sizes[3] = {7,8,9};Mat M(3,sizes,CV_8U,Scalar::all(0)) | 创建多维数据,其维数为3,每一维的尺度由sizes数组指定 |
| Mat M = Mat::eye(7,7,CV_32F) | 创建一个7 x 7的单位矩阵,每个元素是32位浮点数 |
| Mat M = Mat:zeros(7,7,CV_64F) | 创建一个7 x 7的零矩阵,每个元素是64位浮点数 |
| Mat M = Mat:ones(7,7,CV_64F) | 创建一个7 x 7的全1的矩阵,每个元素是64位浮点数 |
| 语法 | 描述 |
| M.at<double>(i,j) | 访问第i行,第j列的元素,元素类型为double,注意计数从0开始 |
| M.row(1) | 访问第1行 |
| M.col(3) | 访问第3列 |
| M.rowRange(1,4) | 访问第1行到第4行 |
| M.colRange(1,4) | 访问第1列到第4列 |
| M.rowRange(2,5).colRange(1,3) | 访问第2行到第5行,第1列到第3列 |
| M.diag() | 访问对角线 |
| 语法 | 描述 |
| Mat M2 = M1.clone() | 创建M1的复制数据M2 |
| Mat M2;M1.copyTo(M2) | 将M1的数据复制到M2 |
| Mat M1 = Mat::zeros(9,3,CV_32FC3);Mat M2 = M1.reshape(0,3) | 对M1的数据进行调整后生成M2 |
| Mat M2 = M1.t() | M1的转置 |
| Mat M2 = M1.inv() | M1的逆 |
| Mat M3 = M1 * M2 | M1乘以M2 |
| Mat M2 = M1 + s | M1 加上一个标量 |
3.cv::Mat类对象基本操作
(1)读取图像,显示图像,存储图像
#include <iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
//创建两个个Mat对象
Mat image,result;
//显示矩阵的大小
cout<<"image.width = "<<image.size().width<<" image.height = "<<image.size().height<<endl;
//读取图片
image = imread("../images/GuiZhou.jpg");
//判断图像是否读取成功
if(!image.data){
cout<<"read image failed!"<<endl;
}
//显示原始图像
namedWindow("Original image!");
imshow("Original image!",image);
//对图像进行水平翻转,并且将翻转之后的结果存放在result矩阵中
flip(image,result,1);//1-表示水平翻转,0-表示垂直翻转,负数表示上下左右同时翻转
//显示翻转之后的图像
namedWindow("flip image!");
imshow("flip image!",image);
//将翻转之后的图像保存下来
imwrite("flip.png",result);
waitKey(0);
return 0;
}
原始图像

翻转之后的图像
参考书:
《数字图像处理》
文章介绍了OpenCV中的核心数据结构cv::Mat,包括其模板特性、如何创建对象、基本操作,如读取、显示和存储图像,以及矩阵的翻转等图像处理操作。此外,还提到了Mat类的内存管理和引用计数机制。
545

被折叠的 条评论
为什么被折叠?



