Opencv Mat类
(一)赋值运算:
Mat 类中的赋值算子 “=” 和 拷贝构造函数,涉及的是浅拷贝,仅仅是复制了矩阵头。
如果想要深拷贝,达到复制图像矩阵的目的,应使用 clone() 或 copyTo() 函数。
(二)常用构造方法:
1、无参数构造方法;
Mat::Mat()
2、创建行数为 rows,列数为 col,类型为 type 的图像;
Mat::Mat(int rows, int cols, int type)
3、创建大小为 size,类型为 type 的图像;
Mat::Mat(Size size, int type)
4、创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s;
Mat::Mat(int rows, int cols, int type, const Scalar& s)
cv::Mat image(640, 480, CV_8U, cv::Scalar(255));
5、创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s;
Mat::Mat(Size size, int type, const Scalar& s)
cv::Mat image(img.size(), CV_8U, cv::Scalar(0));
6、将m赋值给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据,属于浅拷贝;
Mat::Mat(const Mat& m)
7、创建的新图像为m的一部分,具体的范围roi指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据。
Mat::Mat(const Mat& m, const Rect& roi)
8、创建3*3矩阵
Mat mat= (Mat_<float>(3, 3) <<0, 1, 2, 3, 4, 5, 6, 7, 8);
9、特殊矩阵
Mat image = Mat::eye(3, 3, CV_32F);//单位矩阵
Mat image = Mat::zeros(3, 3, CV_8UC1);//零矩阵
Mat image = Mat::eye(3, 3, CV_64F);//对角矩阵
Mat image = Mat::ones(3, 3, CV_32F);//一矩阵
补充:Mat 中元素的数据类型,其格式为 CV_{8U, 16S, 16U, 32S, 32F, 64F}C{1, 2, 3} 或 CV_{8U, 16S, 16U, 32S, 32F, 64F}C(n)
CV_8U:8U 表示 8 位无符号整数0~255,单通道
CV_8UC3:C表示char,3表示三通道
(三)成员函数:
1、访问灰度图test.jpg图像的(0 , 0)元素
uchar ele = image.at<uchar>(0,0);
cout <<(int) ele << endl;
三通道图像:image.at(i,j)[x]表示某个通道中在(i,j)位置的像素值。
x=0(B),x=1(G),x=2(R)
double型数据
浮点数
相当于CV_8UC3
cv::Mat image(3, 3, CV_8UC3, cv::Scalar(100, 200, 300));
uchar ele = image.at<cv::Vec3b>(1, 1)[0];
cout <<(int) ele << endl;
2、读取图像第0行,首个像素地址、读取首个像素值。
image.ptr <uchar>(0);
image.ptr <uchar>(0)[0];
3、channels返回图像通道数
image.channels()
4、复制图像
img = image.clone()
5、读取图像尺寸
image.size()
6、读取图像行、列
image.rows
image.cols
7、读取图像类型
image.type()
8、读取图像深度,用来度量每一个像素中每一个通道的精度
image.depth()
CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5,CV_64F=6
9、saturate_cast防止数据溢出
cv::saturate_cast<uchar>(-100)//输出为0
cv::saturate_cast<uchar>(260)//输出为255
10、数据类型转化
void convertTo( OutputArray m, int rtype, double alpha=1, double
beta=0 ) const;
m – 目标矩阵。如果m在运算前没有合适的尺寸或类型,将被重新分配。
rtype – 目标矩阵的类型。
alpha – 尺度变换因子(可选)。
beta – 附加到尺度变换后的值上的偏移量(可选)。
image类型是CV_8UC1,转为CV_64FC1类型
image.convertTo(image_out,CV_64FC1);
image.convertTo(image_out, CV_64FC1, 1 / 255.0)
pixel_out = pixel*1/255+255
11、数据类型对应关系
Mat_<uchar>---------CV_8U
Mat<char>-----------CV_8S
Nat_<short>---------CV_16S
Mat_<ushort>--------CV_16U
Mat_<int>-----------CV_32S
Mat_<float>----------CV_32F
Mat_<double>--------CV_64F
12、Mat范围赋值
Mat a = Mat::zeros(3, 3, CV_32F);
Mat b = Mat::ones(2, 3, CV_32F);
b.copyTo(a.rowRange(0, 2));
后期补充!!!!!