OpenCV学习笔记(2):Mat矩阵的初始化
来源:互联网 发布:浙江农产品出口数据 编辑:程序博客网 时间:2024/06/05 04:26
OpenCV学习笔记(2):Mat矩阵的初始化
在研究Mat矩阵的初始化的时候,发现其不能像Matx轻量级矩阵那样,直接利用数组来进行初始化,而是利用一个内部的变量类型:Scalar来进行初始化的。参考手册中的构造函数如下所示:
- (1) Mat::Mat()
- (2) Mat::Mat(int rows, int cols, int type)
- (3) Mat::Mat(Size size, int type)
- (4) Mat::Mat(int rows, int cols, int type, constScalar& s)
- (5) Mat::Mat(Size size, int type, constScalar& s)
- (6) Mat::Mat(const Mat& m)
- (7) Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
- (8) Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
- (9) Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
- (10) Mat::Mat(const Mat& m, const Rect& roi)
- (11) Mat::Mat(const CvMat* m, bool copyData=false)
- (12) Mat::Mat(const IplImage* img, bool copyData=false)
- (13) template<typename T, int n> explicit Mat::Mat(const Vec<T, n>& vec, bool copyData=true)
- (14) template<typename T, int m, int n> explicit Mat::Mat(const Matx<T, m, n>& vec, bool copyData=true)
- (15) template<typename T> explicit Mat::Mat(const vector<T>& vec, bool copyData=false)
- (16) Mat::Mat(const MatExpr& expr)
- (17) Mat::Mat(int ndims, const int* sizes, int type)
- (18) Mat::Mat(int ndims, const int* sizes, int type, constScalar& s)
- (19) Mat::Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0)
- (20) Mat::Mat(const Mat& m, const Range* ranges)
似乎这样的矩阵让我们用起来感觉很不顺手,不过接着往下读参考手册,你会发现这样一个例子:
Mat H(100, 100, CV_64F);
for(int i = 0; i < H.rows; i++)
for(int j = 0; j < H.cols; j++)
H.at<double>(i,j)=1./(i+j+1);
通过这个例子,我们尝试来给Mat类型初始化。
第一种改进:(直接由以上例子仿制而来)
//用一个常数来初始化矩阵
void InitMat(Mat& m,float t)
{
for(int i=0;i<m.rows;i++)
for(int j=0;j<m.cols;j++)
m.at<float>(i,j)=t;
}
主程序:
int _tmain(int argc, _TCHAR* argv[])
{
//Mat矩阵中的初始化,可以利用Mat::at()来完成
Mat M0(3,3,CV_32F);
InitMat(M0,3);
}
第二种改进:
//用一个一维数组来初始化矩阵
void InitMat(Mat& m,float* num)
{
for(int i=0;i<m.rows;i++)
for(int j=0;j<m.cols;j++)
m.at<float>(i,j)=*(num+i*m.rows+j);
}
主程序:
int _tmain(int argc, _TCHAR* argv[])
{
//Mat矩阵中的初始化,可以利用Mat::at()来完成
float m0[]={ 1,2,3,
6,5,4,
7,8,9 };Mat M0(3,3,CV_32F);
InitMat(M0,m0);
}
第三种改进:
//希望利用二维数组来初始化
void InitMat(Mat& m,float(*p)[3])
{
for(int i=0;i<m.rows;i++)
for(int j=0;j<m.cols;j++)
m.at<float>(i,j)=*(*(p+i)+j);
}主程序:
int _tmain(int argc, _TCHAR* argv[])
{
//Mat矩阵中的初始化,可以利用Mat::at()来完成
float m[][3]={ 1,2,3,
6,5,4,
7,8,9 };Mat M0(3,3,CV_32F);
InitMat(M0,m);
}
然而,注意在传递二维数组的时候,第三种方法的局限性在于必须要知道每一维度的元素个数,其实可以将二维数组,例如a[2][3]的数组名称a直接转换成一个float指针传递进去,当成一位数组使用。即,
主程序:
int _tmain(int argc, _TCHAR* argv[])
{
//Mat矩阵中的初始化,可以利用Mat::at()来完成
float m[][3]={ 1,2,3,
6,5,4,
7,8,9 };
Mat M0(3,3,CV_32F);
InitMat(M0,(float*)m);
}
注:
数组和指针在参数传递时的对应关系:
实参 形参
数组的数组: char a[8][10] char(*p)[10]
指针的数组: char *a[10] char **p
数组指针(行指针): char(*a)[8] char(a)[8]
指针的指针: char **a char**a
结果运行截图如下:
附注:有关多维数组的参数传递问题,详细参见《C专家编程,Page225》
- OpenCV学习笔记(2):Mat矩阵的初始化
- OpenCV学习笔记(2):Mat矩阵的初始化
- OpenCV学习笔记(2):Mat矩阵的初始化
- Opencv 学习笔记(2):Mat矩阵的初始化
- OpenCv:Mat矩阵的初始化
- OpenCV Java学习笔记(一)--Mat矩阵的数据类型转换
- opencv笔记(矩阵Mat的常用操作)
- Mat矩阵的初始化
- Mat矩阵的初始化
- [openCV] opencv学习笔记-入门(25)Mat 的学习
- OpenCV学习笔记-Mat
- OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解
- OpenCv学习笔记(五)--创建Mat矩阵对象常用的几种方式
- OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解
- opencv Mat元素访问和Mat矩阵初始化
- OpenCV中Mat类的学习笔记
- opencv学习:mat的属性笔记
- 【Ubuntu+OpenCV】OpenCV之矩阵创建、初始化--学习笔记【4】
- Deformable Part Model的学习
- Redhat 5.4 Orcle RAC 数据库 从10.2.0.1升级到 10.2.0.4
- DPM(Defomatble Parts Model)原理
- 树状数组 Binary Indexed Trees
- 并发编程之Operation Queue和GCD
- OpenCV学习笔记(2):Mat矩阵的初始化
- Spring ibatis事务管理
- OpenDaylight实战手记(二)OpenDaylight编译、安装、运行
- android 如何修改网页默认字体太小 XML
- 关于Android文件Apk下载的那点事
- 索引特性之存列值优化sum/avg
- termio.h 的解释
- wince5.0模拟器连接ActiveSync和共享网络PC分享上网及运行BS程序(模拟手持设备)
- java后台报Too many connections