Mat矩阵的初始化

转载 2016年06月02日 10:09:56

在研究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》

C++ 动态分配数组空间,以及opencv中Mat类的初始化

在C++中,如果想要申请动态数组,必须要用动态分配的方式。
  • sjtu_edu_cn
  • sjtu_edu_cn
  • 2016年08月29日 10:04
  • 3242

OpenCV学习笔记(2):Mat矩阵的初始化

在研究Mat矩阵的初始化的时候,发现其不能像Matx轻量级矩阵那样,直接利用数组来进行初始化,而是利用一个内部的变量类型:Scalar来进行初始化的。参考手册中的构造函数如下所示: (1) Mat:...
  • zssureqh
  • zssureqh
  • 2012年05月24日 18:42
  • 83000

Opencv中如何保存Mat矩阵

Opencv中如何保存Mat矩阵        最近在学机器学习,用opencv的时候对于如何保存Mat矩阵纠结死了,查了N久的网页终于给找到了!!   在OpenCV2.0以后...
  • lcydhr
  • lcydhr
  • 2016年05月13日 15:50
  • 502

矩阵Mat操作总结

一、矩阵 Mat I,img,I1,I2,dst,A,B; double k,alpha; Scalar s; 1.加法 I=I1+I2;//等同add(I1,I2,I); add(I1,I2,dst...
  • qq61394323
  • qq61394323
  • 2016年11月24日 10:59
  • 1257

OpenCV中矩阵类详解之一:Mat

Mat::eye 返回一个恒等指定大小和类型矩阵。 C++: static MatExpr Mat::eye(int rows, int cols, inttype) C++: static MatE...
  • u012564690
  • u012564690
  • 2014年01月02日 09:34
  • 22227

初始化Mat的几种方法

1. 调用Mat的构造函数或者create函数,如:   // make a 7x7 complex matrix filled with 1+3j. Mat M(7,7,CV_32FC2,Sca...
  • lichengyu
  • lichengyu
  • 2014年08月15日 21:23
  • 15874

opencv Mat元素访问和Mat矩阵初始化

*
  • lz20120808
  • lz20120808
  • 2015年05月18日 14:48
  • 2971

cv Mat 用数组和指针初始化

cv::Mat 超过20种构造函数重载,其中带有data 和 step参数的构造函数不会重新分配内存,同时也不负责内存的释放,构造函数中只是简单将Mat.data 赋值为传入的data参数. 其中用...
  • springvimper
  • springvimper
  • 2016年03月06日 20:46
  • 369

opencv删除mat矩阵的多行或者多列

opencv删除mat矩阵的多行或者多列做项目的时候需要删除选定矩阵的多行或者多列,百度了许久发现opencv里面没有这样的函数,翻墙去国外搜索一下 ,同样没有找到这样的函数,因此,自己写了一个简单...
  • mikedadong
  • mikedadong
  • 2016年05月20日 22:07
  • 2795

Mat对象的初始化和一些相关操作函数

Mat对象在opencv的图像处理中起着至关重要的作用。对于Mat对象的初始化有很多种方法。 (1)Mat(Size size, int type);//size数据可以通过Mat的子函数size获取...
  • ZouCharming
  • ZouCharming
  • 2017年04月08日 11:12
  • 1906
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mat矩阵的初始化
举报原因:
原因补充:

(最多只允许输入30个字)