创建一个Mat对象的多种方法:
1:使用Mat()构造函数
Mat(2,2,CV_8UC3,Scalar(0,0,255));
对于二维多通道图像,首先要定义的是其尺寸,即行数和列数。然后需要指定存储元素的数据类型以及每个矩阵点的通道数。为此,依据下面的规则有多种定义:
即:cv_[位数]【带符号与否】【类型前缀】c【通道数】
2:方法二在c\c++中通过构造函数进行初始化
示范代码:
int sz[3]={2,2,2};
Mat L(3,sz,CV_8UC,Scalar::all(0));
上面的例子演示了如何创建一个超过两维的矩阵:指定维数,然后传递一个指向数组的指针,这个数组包括每个维度的尺寸;
3:为已存在的IplImage指针创建信息头。
示范代码:
IplImage* img=cvLoadImage("1.jpg",0);
Mat mac(img);
4:利用Create()函数
利用Mat类中的Create()成员函数进行Mat类的初始化操作,示范代码如下。
M.create(4,4,CV_8UC(2));
5:采用MATLAB式的初始化方式
方法五采用MATLAB形式的初始化方式:zeros(),ones(),eyes().使用一下方式指定尺寸和数据类型:
Mat E=Mat::eye(4,4,CV_64F);
Mat O=Mat::ones(2,2,CV_32F);
Mat Z =Mat::zeros(3,3,CV_8UC1);
6:对小矩阵使用逗号分割式初始化函数
Mat C=(Mat_double>(3,3)<<0,0,1,3,34,56,2,3,4);
7:为已存在的对象创建新信息头
Mat RowClone=C.row(1).clone();
访问图像元素的方式
1:用指针访问元素
用指针访问元素的这种方法利用的是c语言中的操作符【】;这种方法最快,但是略有点抽象。
范例代码:
int rowNumber=inputImage.rows;
int colNumber=inputImage.cols;
for(int i=0;i<rowNumber;i++)
{
uchar * data=inputImage.ptr<uchar>(i);//获取第i行的首地址
for(int j=0;j<colNumber;j++)
{
cout<<data[j]<<endl;
}
}
2:用迭代器操作像素
在迭代法中,我们需要做的仅仅是获得图像矩阵的begin和end,然后增加迭代直至从begin到end。将*操作符添加在迭代指针前,即可访问当前指向的内容。
相比用指针直接访问可能出现越界的问题,迭代器绝对是非常安全的方法。
//获取迭代器
Mat_<Vec3b>::iterator it=inputImage.begin<Vec3b>();//初始位置的迭代器
Mat_<Vec3b>::iterator itend=inputImage.end<Vec3b>();//初始位置的迭代器
//存取彩色图像像素
for(;it!=itend;it++)
{
cout<<(*it)[0]<<""<<(*it)[1]<<""<<(*it)[2]<<endl;
}
3:动态地址计算
第三中方法为用动态地址 计算来操作像素。下面是用动态地址运算配合at来实现访问像素的功能。
int rowNumber=inputImage.rows;
int colNumber=inputImage.cols;
for(int i=0;i<rowNumber;i++)
{
for(int j=0;j<colNumber;j++)
{
cout<<inputImage.at<Vec3b>(i,j)[0]<<endl;
cout<<inputImage.at<Vec3b>(i,j)[1]<<endl;
cout<<inputImage.at<Vec3b>(i,j)[2]<<endl;
}
}