OpenCV的C++版本中初始化cv::Mat的方法总结以及直接初始化小矩阵的方法(Mat使用总结)

4 篇文章 0 订阅

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)
指定n
n二维: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)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝域小兵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值