1.Mat类

1.1 创建Mat类

  1. cv::Mat a;
  2. a = cv::imread("test.jpeg");
  3. cv::Mat b = a;

值得注意的是,如果删除a,并不会删除b指向的数据,只有在a,b都被删除时,他们指向的数据才会被删除。
因为矩阵头中引用次数标记了引用某个矩阵数据的次数,只有当矩阵数据引用次数为0的时候才会释放矩阵数据。

1.2 声明指定类型的Max类

创建一个3 3的矩阵用于存放double类型数据

  1. 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类

  1. cv::Mat a(640, 480, CV_8UC3);
  2. cv::Mat a(3,3 CV_8UC1);

2. Mat类构造和赋值

2.1 构造

2.2 赋值

  1. cv::Mat a(2, 2, CV_8UC3, cv::Scalar(0, 0, 255));//创建一个3通道矩阵,每个像素都是0,0,255
  2. cv::Mat b(2, 2, CV_8UC2, cv::Scalar(0, 255));//创建一个双通道矩阵,每个像素都是0,255
  3. cv::Mat c(2, 2, CV_8UC1, cv::Scalar(255));//创建一个单通道矩阵,每个像素都是255
  1. cv::Mat a = (cv::Mat_<int>(3, 3) << 1,2,3,4,5,6,7,8,9);
  1. cv::Mat a = (cv::Mat_<int>(3, 3);
  2. for (int i = 0; i < a.rows; i++)
  3. {
  4. for ( int j = 0; j < a.cols; j++)
  5. {
  6. c.at<int>(i, j) = i + j;
  7. }
  8. }
  1. cv::Mat a = cv.Mat::eye(3, 3, CV_8UC1);
  2. cv::Mat b = (cv::Mat_<int>(1 3) << 1, 2, 3);
  3. cv::Mat c = cv.Mat::diag(b);
  4. cv::Mat d = cv.Mat::ones(3, 3, CV_8UC1);
  5. cv::Mat e = cv.Mat::zeros(3, 3, CV_8UC1);

2.3 运算

乘法运算

  1. cv::Mat j, m;
  2. double k;
  3. j = c * d;
  4. k = a.dot(b);
  5. m = a.mul(b);

2.4 元素读取

图2-5.png
三通道3*3 矩阵存储方式