1.type数据类型
常量类型的命名规则为:CV_(位数)+(数据类型)+(通道数)。关系如下:
| C1 | C2 | C3 | C4 |
CV_8U | 0 | 8 | 16 | 24 |
CV_8S | 1 | 9 | 17 | 25 |
CV_16U | 2 | 10 | 18 | 26 |
CV_16S | 3 | 11 | 19 | 27 |
CV_32S | 4 | 12 | 20 | 28 |
CV_32F | 5 | 13 | 21 | 29 |
CV_64F | 6 | 14 | 22 | 30 |
U为无符号整型,S为有符号整型,F为浮点型。
例如:CV_32FC1表示float类型,C1表示1个通道
与C++中的基本数据类型对应关系如下:
Mat_<uchar>---------CV_8U
Mat_<char>-----------CV_8S
Nat_<short>---------CV_16S
Mat_<ushort>--------CV_16U
Mat_<int>-----------CV_32S
Mat_<float>----------CV_32F
Mat_<double>--------CV_64F
CV_8U 8位无符号整数 (0…..255)
CV_8S 8 位符号整数 (-128…..127)
CV_16U 16 位无符号整数 (0……65535)
CV_16S 16 位符号整数 (-32768…..32767)
CV_32S 32 位符号整数 (-2147483648……2147483647)
CV_32F 32 位浮点数 (-FLT_MAX ………FLT_MAX,INF,NAN)
CV_64F 64 位浮点数 (-DBL_MAX ……….DBL_MAX,INF,NAN)
2.cv::Mat的定义和初始化
2.1、默认形式
cv::Mat m;
2.2、指定类型和大小(行列)的二维数组
cv::Mat m(int cols,int rows,int type);
或者 cv::Mat m(Size(int cols,int rows),int type);
注:Size(width, height), 宽高,type就是第一小节中的7个基本类型
2.3、有初始化值的指定类型和大小(行列)的二维数组
cv::Mat m(int cols,int rows,int type,const Scalar& s);
2.4、使用预先存在数据定义的指定类型和大小(行列)的二维数组
cv::Mat m(int rows,int cols,int type,voiddata,size_t step = AUTO_STEP)
2.5、指定大小(size)和类型的二维数组
cv::Mat m(cv::Size sz, int type,const Scalar& s);
2.6、使用预先存在的数据定义的制定大小(size)和类型的二维数组
cv::Mat m(cv::Size sz, int type,voiddata,size_t step=AUTO_STEP);
2.7、指定类型多维数组
cv::Mat m(int ndims, const int sizes, int type);
2.8、有初始化值的指定类型多维数组
cv::Mat m(int ndims, const int* sizes, int type, const Scalar& s);
3.需要数据拷贝上午cv::Mat的定义和初始化
3.1、拷贝构造形式
cv::Mat m(const cv::Mat& mat);
cv::Mat m(const cv::Mat& mat,const cv::Range& rows, const cv::Range& cols);
cv::Mat m(const cv::Mat& mat, const cv::Rect& roi);
其中mat就是输入的拷贝的数据
3.1、使用多维数组中指定范围内的数据的拷贝构造
cv::Mat(const cv::Mat& mat, const cv::Range* ranges);
4.其他形式
4.1、使用cv::Vec定义相同类型、大小为n的一维数组
cv::Mat m(const cv::Vec<T, n>& vec, bool=copyData=true);
4.2 使用STL vector定义相同的一维数组
cv::Mat (const std::vector& vec, bool copyData=true);
4.3 使用数组或者指针初始化
plmage* Img = cvLoadImage("test.jpg",test);
Mat Test(Img);
int a[2][2] = { 1, 2, 3, 4};
Mat m1(2,2,CV_32S,a); //float 对应的是CV_32F,double对应的是CV_64F
4.5使用利用create函数
M.create( 4, 4, CV_8UC1);//CV_8UC2里面的1表示1通道
4.6 矩阵较小时,使用Mat_进行初始化
Mat C =(Mat_<double>(3,3)<<0,1,0,-2,1,-1,0,-1,0);//直接赋初始值的方法
4.7 使用zeros()、ones()、eye()进行初始化
cv::Mat M = cv::Mat::zeros(int rows,int cols,int type);//零矩阵
cv::Mat M = cv::Mat::ones(int rows,int cols,int type);//1矩阵
cv::Mat m = cv::Mat::eye(int rows,int cols,int type);//主对角线为1
5 下面主要记录三种常见的访问Mat的方式:1.at访问 2.ptr访问 3.data访问
Mat中不管是以at访问还是ptr访问,都是行优先 ,先Y轴后X轴(即先行后列)
5.1 Img1.at<float>(i,j) = 0.1f
5.2 img2.ptr<float>(i)[j] = 0.2f;
5.3 Mat Img3(20, 20, CV_32F);
float* pData = (float*)Img3.data;
for (int i=0; i<20; i++)
{
for (int j=0; j<20; j++)
{
*(pData) = 0.3f;
pData++;
}
}
5.4 Mat img4(20, 20, CV_32F);
for (int i=0; i<20; i++)
{
for (int j=0; j<20; j++)
{
((float*)Img3.data)[i*20+j] = 0.4f;
}
}