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)特殊矩阵
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)矩阵的遍历
- A. 指针数组方式
uchar *pData = (uchar*)imSrc.data;`在这里插入代码片`
for(int i=0;i<imSrc.rows; ++i)
{
for(int j=0;j<imSrc.cols*imSrc.channels();++j)
{
std::cout<<(int)pData[j]<<std::endl;
}
}
- 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.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); //矩形的缩放