文章目录
一、Mat类
1.成员变量
rows
:行/高cols
:列/宽dims
:维度。比如图片就是二维的。size
:长 x 宽data
:指向其存储的数据的指针。可以用来判断是否读取成功。
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat image(3,4,CV_8UC1);
cout << image << endl;
/*
[ 0, 0, 0, 0;
0, 0, 0, 0;
0, 0, 0, 0]
*/
cout << image.rows << endl;
// 3
cout << image.cols << endl;
// 4
cout << image.dims << endl;
// 2
cout << image.size << endl;
// 3 x 4
cout << (bool)image.data << endl;
// 1
return 0;
}
2.成员函数(实例化的成员记为image)
(1)Mat::row(int row)和Mat::col(int col)
原型
Mat image.row(int row)
Mat image.col(int col)
参数
下标从0开始。如:row(1)/col(1)是第二行/列。
对于另外一个Mat类
- 直接使用:引用(改变矩阵B,A也会被改变)
- 加了东西:新的创建(改变矩阵B,A不会被改变)
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat A=(Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);
/*
[1, 2, 3;
4, 5, 6;
7, 8, 9]
*/
/* 引用形式 */
Mat B=A.row(1);
cout<<B<<endl;
// [4, 5, 6]
B=B*2;
cout<<B<<endl;
// [8, 10, 12]
cout<<A<<endl;
// 证明是引用,B被改变,A也被改变
/*
[1, 2, 3;
8, 10, 12;
7, 8, 9]
*/
/* 新的创建方式1:重载操作符*/
A=(Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);
Mat C=A.row(1)+0;
cout<<C<<endl;
//[4, 5, 6]
C=C*2;
cout<<C<<endl;
//[8, 10, 12]
cout<<A<<endl;
//证明是新的创建,B被改变,A没有被改变
/*
[1, 2, 3;
4, 5, 6;
7, 8, 9]
*/
/* 新的创建方式2:深拷贝 */
Mat D;
A.row(1).copyTo(D); // 或者D = A.row(1).clone();
cout<<D<<endl;
//[4, 5, 6]
D=D*2;
cout<<D<<endl;
//[8, 10, 12]
cout<<A<<endl;
//证明是新的创建,D被改变,A没有被改变
/*
[1, 2, 3;
4, 5, 6;
7, 8, 9]
*/
return 0;
}
对于原Mat进行操作:
- 直接使用:不起作用
//失败
Mat A;
...
A.row(i) = A.row(j); // will not work
- 有了别的东西:才起作用
//成功
Mat A;
...
// 方式1:
A.row(i) = A.row(j) + 0;
// 方式2:推荐方式
A.row(j).copyTo(A.row(i));
例子:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat A=(Mat_<int>(3,3)<<1,2,3,4,5,6,7,8,9);
/*
[1, 2, 3;
4, 5, 6;
7, 8, 9]
*/
/* 在原来Mat上 */
A.row(1)=A.row(0);
cout<<A<<endl;
//不起作用
/*
[1, 2, 3;
4, 5, 6;
7, 8, 9]
*/
A.row(1)=A.row(0)+0;
cout<<A<<endl;
//起作用:第二行是在第一行的基础进行的了
/*
[1, 2, 3;
1, 2, 3;
7, 8, 9]
*/
A.row(0).copyTo(A.row(2));
cout<<A<<endl;
//起作用:第三行是在第一行的基础进行的了
/*
[1, 2, 3;
1, 2, 3;
1, 2, 3]
*/
return 0;
}
(2)Mat::type()
获取图像type(那个CV_8UC3)
Mat srcImage=imread("3.jpg");
cout<<srcImage.type()<<endl;
//16
//这个16就是CV_8UC3对应的int值
(3)Mat::resize()
作用:
该变矩阵的行数
原型
void cv::Mat::resize(size_t sz)
例子
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat A=(Mat_<int>(2,3)<<1,2,3,4,5,6);
A.resize(4);
cout<<A<<endl;
/*
[1, 2, 3;
4, 5, 6;
0, 0, 0;
0, 0, 0]
*/
return 0;
}
3.类外相关函数
(1)resize()
作用
不像Mat内的成员函数resize()
,它是用来改变矩阵的尺寸(行数和列数)
原型
void resize(
InputArray src,
OutputArray dst,
Size dsize,
double fx=0,
double fy=0,
int interpolation=INTER_LINEAR
);
参数
- src:输入图像
- dst:输出图像
- dsize:输出图像的尺寸。如果为0,则由fx和fy计算得到: d s i z e = S i z e ( r o u n d ( f x ∗ s r c . c o l s ) , r o u n d ( f y ∗ s r c . r o w s ) ) dsize=Size(round(fx*src.cols),round(fy*src.rows)) dsize=Size(round(fx∗src.cols),round(fy∗src.rows))
- fx:宽的缩放(默认为0时,由下式进行计算: ( d o u b l e ) d s i z e . w i d t h / s r c . c o l s (double)dsize.width/src.cols (double)dsize.width/src.cols)
- fy:高的缩放(默认为0时,由下式进行计算: ( d o u b l e ) d s i z e . h e i g h t / s r c . r o w s (double)dsize.height/src.rows (double)dsize.height/src.rows)
- interpolation:插值方式
- INTER_LINEAR(默认):线性插值 (用于放大图像最优)
- INTER_NEAREST:最近邻插值
- INTER_AREA:区域插值 (用于缩小图像最优)
- INTER_ CUBIC:三次样条插值
- INTER_LANCZOS4:Lanczos插值
PS:dsize、fx、fy不能同时都为0
例子:
//方式一:dsize
Mat srcImage=imread("1.jpg");
Mat dstImage;
resize(srcImage,dstImage,Size(512,512));
//方式二:
Mat srcImage=imread("1.jpg");
Mat dstImage;
resize(srcImage,dstImage,Size(),0.5,0.5);
(2)拷贝
①浅层拷贝(相当于引用:同一个)
该变一个对其他的也会改变
Mat A = imread("1.jpg");
Mat B(A); // 引用1:使用拷贝构造函数
Mat C = A; // 引用2:使用赋值运算符
②深层拷贝(新的)
改变原,复制的不被影响
Mat D = A.clone(); // 复制1:image.clone()成员函数
Mat E;
A.copyTo(E); // 复制2:image1.copyTo(image2)成员函数
PS:相关使用:
OpenCV之图像叠加ROI与copyTo(ROI,mask)
二、其他
1.和其他类关系
Mat类:可以用于存图像和矩阵(图像其实就是以矩阵的形式存在)
InputArray
/OutputArray
/InputOutputArray
类:可以直接填入Mat类或std::vector点集。
2.颜色体系
BGR:原始图片虽然是RGB(红绿蓝)顺序的,但OpenCV读入的图片以BGR顺序读取。
HSV和HLV:色调、饱和度和亮度/明度。通常可以抛弃最后一个使算法对光照条件不敏感