1.Mat类
1.1 创建Mat类
cv::Mat a;
a = cv::imread("test.jpeg");
cv::Mat b = a;
值得注意的是,如果删除a,并不会删除b指向的数据,只有在a,b都被删除时,他们指向的数据才会被删除。
因为矩阵头中引用次数标记了引用某个矩阵数据的次数,只有当矩阵数据引用次数为0的时候才会释放矩阵数据。
1.2 声明指定类型的Max类
创建一个3 3的矩阵用于存放double类型数据
cv::Mat A = Mat_<double>(3, 3);
数据类型 | 具体类型 | 取值范围 |
---|---|---|
CV_8U | 8位无符号整数 | 0~255 |
CV_8S | 8位符号整数 | -128~127 |
CV_16U | 16位无符号整数 | 0~65536 |
CV_16S | 16位符号整数 | -32768~32767 |
CV_32S | 32位符号整数 | -2147483648~2147483647 |
CV_32F | 32位浮点整数 | -FLT_MAX~FLT_MAX,INF,NAN |
CV_64F | 64位浮点整数 | -DBL_MAX~DBL_MAX,INF,NAN |
CV还定义了通道数标识,C1,C2,C3,C4分别表示单通道,双通道,三通道,四通道。
如CV_8UC1表示8位单通道数据,CV_8UC3表示8位3通道数据。
1.3 通过openCV数据类型创建Mat类
cv::Mat a(640, 480, CV_8UC3);
cv::Mat a(3,3 CV_8UC1);
2. Mat类构造和赋值
2.1 构造
2.2 赋值
cv::Mat a(2, 2, CV_8UC3, cv::Scalar(0, 0, 255));//创建一个3通道矩阵,每个像素都是0,0,255
cv::Mat b(2, 2, CV_8UC2, cv::Scalar(0, 255));//创建一个双通道矩阵,每个像素都是0,255
cv::Mat c(2, 2, CV_8UC1, cv::Scalar(255));//创建一个单通道矩阵,每个像素都是255
cv::Mat a = (cv::Mat_<int>(3, 3) << 1,2,3,4,5,6,7,8,9);
cv::Mat a = (cv::Mat_<int>(3, 3);
for (int i = 0; i < a.rows; i++)
{
for ( int j = 0; j < a.cols; j++)
{
c.at<int>(i, j) = i + j;
}
}
cv::Mat a = cv.Mat::eye(3, 3, CV_8UC1);
cv::Mat b = (cv::Mat_<int>(1, 3) << 1, 2, 3);
cv::Mat c = cv.Mat::diag(b);
cv::Mat d = cv.Mat::ones(3, 3, CV_8UC1);
cv::Mat e = cv.Mat::zeros(3, 3, CV_8UC1);
2.3 运算
乘法运算
cv::Mat j, m;
double k;
j = c * d;
k = a.dot(b);
m = a.mul(b);
2.4 元素读取
三通道3*3 矩阵存储方式