您的位置:首页 > 运维架构

cv::Mat 基本用法之初始化

2017-07-21 16:18 393 查看



cv::Mat 基本用法之初始化



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




 

似乎这样的矩阵让我们用起来感觉很不顺手,不过接着往下读参考手册,你会发现这样一个例子:

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv