目录
1、矩阵Mat操作
(1)Mat的构造函数
Mat(); //无参构造函数(默认)
Mat(int rows,int cols, int type); //指定形状
Mat(cv::Size size, int type);
Mat(int rows,int cols, int type, const Scalar&s); //指定像素值
Mat(cv::Size size, int type, const Scalar &s);
Mat(const Mat&m); //拷贝构造函数,共用同一份图像数据,不会进行深拷贝
Mat(int rows,int cols,int type, void *data, size_t step=AUTO_STEP);//使用指定的data作为该Mat对象的图像数据
Mat(const Mat& m,const Range& rRange,const Range& cRange); //创建的Mat对象共用m的一部分图像数据
Mat(const Mat& m,const Rect& rect); //创建的Mat对象共用m的一部分图像数据
Mat(int ndims,const int *sizes,int type,const Scalar& s);
(2)Mat的数据类型
CV_位数+数据类型+通道数
CV_8U == CV_8UC1; //8bits uchar 0-255, 1 channels
CV_16SC3; //16bits shart -32768-32767, 3 channels
(3)Mat的拷贝(深拷贝和浅拷贝)
注意Mat的深拷贝和浅拷贝
// 浅拷贝:
Mat imNew = Mat(imIn);
Mat imNew02 = imIn;
// 深拷贝:
Mat imNew = imIn.clone();
Mat imNew02;
imIn.copyTo(imNew02);
(4)Mat的赋值(四种赋值方式)
- A. 直接赋值
Mat m = (Mat_<double>(3,3) << 1,2,3,4,5,6,7,8,9);
- B. 使用数组赋值
int a[2][3] = {1,2,3,4,5,6};
Mat m1(2,3,CV_32S,a);
- C. create函数随机赋值
cv::Mat imSrc;
imSrc.create(4,4,CV_8UC1); //对imSrc进行随机赋值
- D. 设置矩阵新值
imSrc.setTo(255,mask);//将imSrc指定的掩膜区域设置为255(单通道),如果是双通道,应该使用cv::Scalar(255,255,255)
(5)特殊矩阵(0矩阵、1矩阵、单位矩阵)
Mat im01 = Mat::zeros(100,100,CV_8SC1); //全0矩阵
Mat im02 = Mat::ones(cv::Size(100,100),CV_16F); //全1矩阵
Mat eye = Mat::eye(cv::Size(3,3),CV_32F); //单位矩阵
(6)创建矩阵头
在opencv中,矩阵类Mat的数据结构 = 矩阵头 + 指向矩阵数据部分的指针。
矩阵头用于存储矩阵尺寸、存储方法、存储地址和引用次数等
以下成员函数用于创建新的矩阵头,并共享原矩阵的数据
cv::Mat row(int y); //该函数根据指定的行索引创建一个矩阵头
cv::Mat col(int x); //根据指定的列索引创建一个矩阵头
cv::Mat rowRange(int iStartRow, int iEndRow);
cv::Mat colRange(int iStartCol, int iEndCol);
(7)图像的遍历(指针、ptr、at、迭代器iterator)
- A. 指针数组方式
uchar *pData = (uchar*)imSrc.data;
pData = pData + j*imSrc.step + i*imSrc.elemSize;
- B. .ptr方式
// 单通道
uchar * data00 = imSrc.ptr<uchar>(0); //指向第一行的第一个元素
uchar * data01 = imSrc.ptr<uchar>(0)[1]; //指定第一行的第二个元素
// 多通道
cv::Vec3b *data00 = imSrc.ptr<cv::Vec3b>(0)[1];// 类似,只是type不一样
- C. at方式
imSrc.at<cv::Vec3b>(i,j)[k]; // 第i行j列k通道的数值
- D. 迭代器遍历方式
cv::MatConstIterator_<cv::Vec3b> iter = imSrc.begin<cv::Vec3b>();
cv::MatConstIterator_<cv::Vec3b> iterEnd = imSrc.end<cv::Vec3b>();
while(iter!=iterEnd){
//TODO
iter++;
}
2. 矩阵类Rect基本介绍
(1)构造函数(两种方式)
cv::Rect(int x, int y, int iwid, int ihgt); //x,y表示矩形的左上角坐标,iwid表示矩形的宽度,ihgt表示矩形的高度
cv::Rect(cv::Point PLftTop, cv::Point PRgtBtm); //PLeftTop表示矩形的左上点,PRgtBtm表示矩形的右下角点
(2)相关函数
Rect对象的面积、尺寸、左上角和右下角坐标、高度和宽度、是否包含某一位置等
rect.area();//返回rect的面积
rect.size();//rect的尺寸
rect.tl(); //rect左上角坐标
rect.br(); //rect右下角坐标
rect.width(); //rect的宽度
rect.height(); //rect的高度
rect.contains(cv::Point(x,y)); //rect是否包含点(x,y)
(3)矩形的交集和并集
cv::Rect rect = rect01 & rect01; //交集
cv::Rect rect = rect01 | rect02; //并集
(4)矩形的平移和缩放
cv::Rect rect = rect01 + cv::Point(-100,-100); //矩形平移
cv::Rect rect = rect01 + cv::Size(-100,-50); //矩形的缩放
3、总结
- Mat相关操作:矩阵的构造、图像的数据类型、图像的拷贝、图像的4种赋值方式、特殊矩阵的介绍、图像像素的4种遍历方式
- Rect类的相关介绍:构造Rect对象的两种方式、和Rect相关的几个函数、Rect的交集和并集、Rect的平移和缩放方式