OpenCV中构建一个Mat的多种方式:
如果有简单的小矩阵,16个元素以内的,可以用下面的代码直接进行初始化
// 这个是调用了cv::Mat_的逗号初始化
// cv::Mat_< _Tp >::Mat_(const MatCommaInitializer_< _Tp > & commaInitializer)
// 查看https://docs.opencv.org/4.5.0/df/dfc/classcv_1_1Mat__.html#a461aed4ac941e71f8f15a6b0f71bb8ba
// 以及https://docs.opencv.org/4.5.0/d6/d9e/classcv_1_1MatCommaInitializer__.html
cv::Mat K = (cv::Mat_<double>(3,3)<<12.0,0,23.4,12.5,12.4,54.6,23,12.0,12.3);
如果想将一个小矩阵赋值到大矩阵的某个区域
smallMatrix.copyTo(bigMatrix(Range(row, row+smallMatrix.rows), Range(col, col+smallMatrix.cols)));
如果是访问多通道的矩阵中某个元素某个通道
cv::Mat m = cv::Mat::zeros(50,50,CV_8UC3)
// 访问(20,20,1)这个索引元素
uchar m = m.at<cv::Vec3b>(20,20)[1]; // 表示每个元素取出来用Vec3b存放,然后访问其第1个通道(从0数起)。
如果是将一个有K个元素的std::vector<cv::Point2d>
变成K行2列的cv::Mat
std::vector<cv::Point2d> points;
cv::Mat point_mat = cv::Mat(points).reshape(1); // reshape(int cn, int rows)会将矩阵设置为指定的通道和行数,列数会自动计算
第一类:不初始化数据:
Mat(),默认的构造函数,矩阵的构造函数有多种,通常默认的构造函数就足够了,opencv函数会自动分配正确的矩阵类型。构造好的矩阵能够被分配给其他矩阵或者矩阵表达式或者被Mat::create分配。
Mat(int row, int cols, int type)
Mat(Size size, int type)
Mat(int ndims, const int * sizes, int type) 第一个参数输入维度数,第二个参数输入整型数组表示形状
Mat(const std::vector & sizes, int type)
第二类:使用OpenCV中的数据结构Scalar、Vec、Matx、Point以及逗号符号进行初始化
Mat(int rows, int cols, int type, const Scalar & s),使用OpenCV中的Scalar初始化矩阵。Scalar最多只有4个元素
Mat(Size size, int type, const Scalar &s)
Mat(int ndims, const int * sizes, int type, const Scalar &s)
Mat(const std::vector & sizes, int type, const Scalar & s)
Mat(const Vec<_Tp,n> & vec, bool copyData=true)
Mat(const Matx<Tp, m, n> & mtx, bool copyData=true),Matx可以用于在编译时已知形状的小矩阵,可以直接输入数据的值进行构造,最多支持16个元素的直接构造,因此Matx可以用于直接构造矩阵。
Mat(const Point<Tp> & pt, bool copyData=true)
Mat(const Point3<Tp> & pt, bool copyData=true)
Mat(const MatCommaInitializer<_Tp> & commaInitializer) 逗号分隔的矩阵初始化器,专门用逗号进行矩阵初始化的方式
Mat(const cuda::GpuMat & m)
Mat(Mat && m)
第三类:使用已有的Mat进行初始化
Mat(const Mat & m)
Mat(const Mat & m, const Range & rowRange, const & colRange=Range::all())
Mat(const Mat & m, const Rect & roi)
Mat(const Mat & m, const Range * ranges)
Mat(const Mat & m, const std::vector & ranges)
第四类:使用一块内存进行初始化
指定行列:Mat(int rows, int cols, int type, void * data, size_t step=AUTO_STEP)
指定Size:Mat(Size size, int type, void data, size_t step=AUTO_STEP)
指定nn二维:Mat(int ndims, const int * sizes, int type, void* data, const size_t * steps = 0)
指定多维数组:Mat(const std::vector & sizes, int type, void * data, const size_t * steps=0)
第五类:使用标准库中的数据结构初始化矩阵
使用vector:Mat(const std::vector<_Tp> & vec, bool copyData=false)
使用list:Mat(const std::initializer_list<_Tp> list)
Mat(const std::initializer_list sizes, const std::initializer_list<_Tp> list)
使用array:Mat(const std::array<_Tp,_Nm> & arr, bool copyData=false)
OpenCV中访问某个元素的多种方式
at函数会返回指定数组元素的引用,为了性能,只有在Debug配置时会检查索引范围。只有一个索引参数的情况只能访问单行或者单列的二维数组。即 1 × N 1×N 1×N或者 M × 1 M×1 M×1的数组。不同的数据类型矩阵在at中输入的模板不一样。
一、直接输入某个维度的索引
at(int i0=0)矩阵是行向量或者列向量时,即行或者列的shape为1时
at<>(int row, int col)
at<>(int i0, int i1, int i2)
二、输入数组、Vec、Point等数据结构作为索引
at(const int * idx)