opencv3.0中Mat类学习日记(成员函数,构造函数,复制构造函数,模板构造函数)

第一:
利用cv::mat创建一个数组:
我们可以使用mat中的一个成员函数create()来申请一个内存区域,这个成员函数通过指定行数rows和列数cols以及数据类型type来配置二维数组的规模,在指明数据类型的同时还需要说明通道数channels。数据类型包括cv_{8u,16s,16u,32s,32F,64F},通道数包括C{1,2,3}。
例如:CV_32FC3表示数组中元素数据类型为32为float类型且为三通道的。
利用create()来初始化一个矩阵:
cv::image;
//生成一个3行10列的矩阵,3通道,32位float型
image.create(3,10,CV_32FC3);
//其实还有一个成员函数CV::Scalar()可以用来设置数组中的元素的初始值
image.setTo(CV::Scalar(1.0f, 0.0f, 1.0f));//表示每个通道中的数据为1.0f,0.0f,1.0f
有一种更为简便的方法来简化上述代码:
CV::Mat image(3,10,CV_32FC3,CV::Scalar(1.0f, 0.0f, 1.0f));
重点:在CV::Mat中是可以进行矩阵赋值的,例如将矩阵matrix_n赋值给矩阵matrix_m.
matrix_m= matrix_n; 我觉得前提应该是这两个矩阵的行列数是一样的。
第二:
介绍一些CV::Mat中的构造函数:
cv::Mat 默认构造函数;
cv::Mat(int rows,int cols,int type,); 指定二维数组的元素类型;
cv::Mat(int rows,int cols,int type, const Scalar()); 指定类型二维数组,并且初始化数据;
cv::Mat(int rows,int cols,int type, voiddata, size_t step=AUTO_STEP); 指定类型二维数组,指定预存储的数据,data指针指向预存储的数据;
cv::Mat(cv::size sz,int type); 指定类型的二维数组,大小由sz决定;
cv::Mat(cv::size sz, int type, void
data, size_t step=AUTO_STEP) 指定类型的二维数组,大小由sz决定,初始化数据为
data指向的数据指针;
cv::Mat(int ndims, const int* sizes, int type); 指定类型的多维数组;
cv::Mat(int ndims, const int *sizes, int type, const Scalar()); 指定类型多维数组,指定初始化值;
cv::Mat(int ndims, const int *sizes, int type, void data, size_t step=AUTO_STEP); 指定类型的多维数组,并利用指定的数据进行初始化;
是不是头晕眼花,尼玛,这么多怎么记住,好吧咱总结一下上面的构造函数:
上面的构造函数主要分为三个类型:
首先要求输入行数rows和列数cols来构造二维数组;
其次利用cv::size sz对象来构造二维数组;
最后构造n维数组并且利一个整形序列来确定每一维数据的维度,这个我没搞懂,我觉得应该这样:比如构造3维数组,利用const int sizes来确定每一维数据的维度。还有可能是这样一个4维数组,a[ [3] [2] [4] [5] ]
第三:
介绍几个典型的复制构造函数,所谓的复制构造函数也就是从已存在的数组的子区中创建新的数组,相当于从一个数组中提取出子区数组成为一个新的数组。
cv::Mat (const Mat&mat); 复制构造函数;
cv::Mat(const Mat&mat, const cv::Range&rows,const cv::Range&cols); 从指定的行列中复制数据形成复制构造函数;
cv::Mat(const Mat&mat, const cv::Rect&roi); 从感兴趣的区域中复制数组形成构造函数;
咱们也来总结一下复制构造函数吧:
分为两类:首先是输入行列的范围来形成新的数组;其次是利用成员函数cv::Rect来指定一个矩形子区域。
第四:
介绍一下模板构造函数,所谓模板构造函数,也就是形式构造一个形式和其他数组一样的数组,比如现在有一个cv::Mat image(3, 10,CV_32FC3, CV::Scalar(1.0f,0.0f,1.0f));的数组,我现在要得到一个跟这个数组格式大小一样的数组a,我们就可以利用模板构造函数达到这个目的。以上只是一个举例,模板构造函数不会从cv::Mat中创建模板,而是通过模板类cv::Vec<>或者cv::Matx<>中来创建对应维度的cv::Mat,或者使用一个
STL vector<>来创建一个相同类型的数组;
模板构造函数:
cv::Mat (const cv::Vec<T,n>&Vec, bool copyData=true); 构造一个如同cv::Vec所指定的类型为T,大小为n的一维数组;
cv::Mat(const cv::Matx<T,m,n>&Vec, bool copyData=true); 构造一个如同cv::Matx所指定的类型为T,大小为m n的二维数组;
cv::Mat(const std::vector&vec, bool typeData=true); 构造一个STL的vector所指定的数据类型为T,大小为vector元素数的一维数组;
第五:
介绍一下静态方法创建一些常用数组,比如单位矩阵
也可以把他们当做成员函数:
cv::Mat::zeros(rows, cols, type); 构造一个大小为rows
cols大小的数据类型为type的,内部元素全为0的矩阵;
cv::Mat::ones(rows, cols, type);构造一个大小为rows
cols大小的,类型为type,内部元素值全为1的矩阵;
构造一个大小为rows
cols大小的,类型为type的单位矩阵;

好了cv::Mat类型的数组就讲完了,有没有觉得很繁琐,但是又很高大上,没错就是这种感觉。

纪念在CSDN写日记的第一天2019/3/22/14:56

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值