cv::Mat储存的数据类型
数据类型 | 具体类型 | 取值范围 | type() |
---|---|---|---|
CV_8U | 8位无符号整数 | 0~255 | 16 |
CV_8S | 8位符号整数 | -128~127 | 17 |
CV_16U | 16位无符号整数 | 0~65535 | 18 |
CV_16S | 16位符号整数 | -32768~32767 | 19 |
CV_32S | 32位符号整数 | -2147483648~2147483647 | 20 |
CV_32F | 32位浮点整数 | -FLT_MAX~FLT_MAX,INF,NAN | 21 |
CV_64F | 64位浮点整数 | -DBL_MAX~DBL_MAX,INF,NAN | 22 |
Mat类矩阵常用属性
属性 | 作用 |
---|---|
cols | 矩阵的列数 |
rows | 矩阵的行数 |
step | 以字节为单位的矩阵的有效宽度 |
elemSize() | 每个元素的字节数 |
total() | 矩阵中元素的个数 |
channels() | 矩阵的通道数 |
type() | 数据类型 |
Mat 构造
// 默认构造
cv::Mat::Mat();
// 利用矩阵尺寸和类型参数构造Mat类
cv::Mat::Mat(int rows, int cols, int type);
// 用Size()构造Mat类
cv::Mat::Mat(Size size(), int type);
// 利用已有矩阵构造Mat类
cv::Mat::Mat(const Mat &m);
// 构造已有Mat类的子类
cv::Mat::Mat(const Mat &m, const Range &roRange, const Range &colRange = Range::all())
// 在构造时赋值
cv::Mat::Mat(int rows, int cols, int type, const Scalar &s);
// 枚举赋值示例
cv::Mat a = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
// 构建一个单位矩阵
cv::Mat::eye(int rows, int cols, int type);
// 构建对角矩阵,参数必须为Mat类型的一维变量,用来存放对角元素的数值
cv::Mat::diag()
// 构建一个全为 1 的矩阵,参数同 eye()
cv::Mat::ones()
// 构建一个全为 0 的矩阵,参数同 eye()
cv::Mat::zeros()
矩阵
/**
* @author IYATT-yx
* @date 2021/2/2
* @brief 矩阵运算 - <<线性代数>>
*/
#include "opencv2/opencv.hpp"
int main()
{
// 矩阵乘法
// 第一个矩阵的列数必须和第二个矩阵的行数相等
// Mat中的数据类型必须是 CV_32FC1 CV_64FC1 CV_32FC2 CV_64FC2 四个中的一种, 即保存的数据必须为 float 或 double
cv::Mat matrix1 = (cv::Mat_<double>(3, 3) << 1, 2, 3, 3, 2, 1, 2, 2, 2);
cv::Mat matrix2 = (cv::Mat_<double>(3, 3) << 5, 6, 3, 2, 1, 1, 3, 2, 5);
std::cout << "matrix1 = \n" << matrix1 << std::endl;
std::cout << "matrix2 = \n" << matrix2 << "\n" << std::endl;
std::cout << "matrix1 × matrix2 =\n" << matrix1 * matrix2 << "\n" << std::endl;
// 1 2 3 5 6 3 1x5+2x2+3x3 1x6+2x1+3x2 1x3+2x1+3x5 18 14 20
// 3 2 1 × 2 1 1 = 3x5+2x2+1x3 3x6+2x1+1x2 3x3+2x1+1x5 = 22 22 16
// 2 2 2 3 2 5 2x5+2x2+2x3 2x6+2x1+2x2 2x3+2x1+2x5 20 18 18
std::cout << "matrix1 ÷ matrix2 =\n" << matrix1 / matrix2 << std::endl;
// matrix1 ÷ matrix2 = matrix1 × matrix2^(-1) 即 matrix1 乘以 matrix2的逆矩阵
std::cout << "____________________________________________________________" << std::endl;
// 矩阵加法和减法
// 要求两个矩阵大小相同
// 对应位置相加减
std::cout << "matrix1 + matrix2 =\n" << matrix1 + matrix2 << std::endl;
std::cout << "matrix1 - matrix2 =\n" << matrix1 - matrix2 << "\n" << std::endl;
std::cout << "____________________________________________________________" << std::endl;
// 矩阵内积
// matrix1三个向量(列): (1, 3, 2) (2, 2, 2) (3, 1, 2)
// matrix2三个向量(列): (5, 2, 3) (6, 1, 2) (3, 1, 5)
// 计算数量积的和: 1x5+3x2+2x3 + 2x6+2x1+2x2 + 3x3+1x1+2x5 = 55
std::cout << matrix1.dot(matrix2) << "\n" << std::endl;
std::cout << "____________________________________________________________"