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
 

运行结果:

 

转自:http://blog.csdn.net/chenyusiyuan/article/details/7974378

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值