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

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐