OpenCV的一些基础知识点

目录

1. cv::Mat对象的创建

1.1 常用的构造函数:

1.2 使用create()函数

1.3 使用matlab风格的函数

2. 一些基本表达

3. 遍历像素值

4. Mat支持的表达式

5. Mat与IplImage和CvMat的转换


1. cv::Mat对象的创建

创建cv::Mat类对象可以使用构造函数、create()或者matlab风格的函数zero()、ones()、eye()等。

1.1 常用的构造函数:

Mat::Mat();  // 无参构造函数;
Mat::Mat(int rows, int cols, int type);  // 创建行数为rows,列数为cols,类型为type的图像;
Mat::Mat(Size size, int type);  // 创建大小为size,类型为type的图像;
Mat::Mat(int rows, int cols, int type, const Scalar & s);  // 创建行数为rows,类数为col,类型为type的图像,并将所有元素初始化为值s;
Mat::Mat(Size size, int type, const Scalar & s);  // 创建大小为size,类型为type的图像,并将所有元素初始化为值s;
Mat::Mat(const Mat & m);  // 将m复制给新创建的对象,此处不会对图像数据进行复制,m和新对象共用图像数据;
Mat::Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);  // 创建行数为rows,列数为cols,类型为type的图像,此构造函数不创建图像所需内存,而是直接使用data所指内存,图像的行步长由step指定;
Mat::Mat(Size size, int type, void* data, size_t step = AUTO_STEP);  // 创建大小为size,类型为type的图像,此构造函数不创建图像数据所需内存,而是直接使用data所指内存,图像行步长由step指定;
Mat::Mat(const Mat & m, const Range & rowRange, const Range & colRange);  // 创建新的图像为m的一部分,具体的范围由rowRange和colRange指定,此构造函数也不进行图像数据的赋值操作,新图像与m共用图像数据;
Mat::Mat(const Mat & m, const Rect & roi);  // 创建的新图像为m的一部分,具体的范围roi指定,此构造函数也不进行图像数据的复制操作,新图像与m共用图像数据。

1.2 使用create()函数

create()函数创建图像,如果create()函数指定的参数与图像之前的参数相同,则不进行实质的内存申请操作;如果参数不同,则减少原始数据内存的索引,并重新申请内存,使用该函数无法设置图像像素的初值。

1.3 使用matlab风格的函数

Mat Z = Mat::zeros(2, 3, CV_8UC1);  // 创建2行3列的8位无符号单通道矩阵,矩阵的值初始化为0
Mat O = Mat::ones(2,3,CV_32F);  // 创建2行3列的32位浮点型单通道矩阵,矩阵初始值为1
Mat E = Mat::eye(2, 3, CV_64F);  // 创建2行3列64位浮点型单通道矩阵

2. 一些基本表达

typedef Vec Vec2b;
typedef Vec Vec3b;
typedef Vec Vec4b;

typedef Vec Vec2s;
typedef Vec Vec3s;
typedef Vec Vec4s;

typedef Vec Vec2f;
typedef Vec Vec3f;
typedef Vec Vec4f;
typedef Vec Vec6f;

typedef Vec Vec2d;
typedef Vec Vec3d;
typedef Vec Vec4d;
typedef Vec Vec6d;

3. 遍历像素值

3.1 使用at()函数,代码可读性高,效率不高;
3.2 使用迭代器MatIterator,配合begin()和end()函数使用;
3.3 通过数据指针,使用ptr()指针。

4. Mat支持的表达式

        · 加法、减法、取负:A+B、A-B、A+s、A-s、s+A、s-A、-A;
        · 缩放取值范围:A*alpha;
        · 矩阵对应元素的乘法和除法:A.mul(B)、A/B、alpha/A;
        · 矩阵乘法:A*B(这里是矩阵乘法,不是矩阵对应元素相乘,需要保证A的行 = B的列);
        · 矩阵转置:A.t();
        · 矩阵求逆和求伪逆:A.inv(),需要保证A的行和列相等;
        · 矩阵比较运算:A compop B、A compop alpha、alpha compop A,compop可以是>、>=、<、<=、==、!=。如果条成立,结果矩阵对应的元素被置为255,否则置为0。
        · 矩阵位逻辑运算:A logicop B、A logicop s、s logicop A、~A,logicop可以是&、|、^。
        · 矩阵对应元素的最大值和最小值:min(A,B)、min(A,alpha)、max(A,B)、max(A,alpha)。
        · 矩阵中元素的绝对值:abs(A)。
        · 叉积和点积:A.cross(B)、A.dot(B)。

5. Mat与IplImage和CvMat的转换

  • Mat转换为IplImage或CvMat,使用等号赋值操作进行类型转换。需要注意的是,类型转换后,IplImage和CvMat与Mat共用同一矩阵数据,而IplImage和CvMat没有引用计数功能,所以Mat对象不能提前释放。
  • IplImage或CvMat转换为Mat,可以使用Mat类的构造函数。这两个构造函数有一个参数copyData,如果该值为false,那么Mat将与IplImage或CvMat共用同一矩阵数据;如果该值为true,Mat会新申请内存,然后将IplImage或CvMat的数据赋值到Mat的数据区。建议该值设置为true。

6. Mat成员函数的表示

  • cv::Mat::depth()表示的是Mat对象的数据类型,比如CV_8U、CV_8S、CV_16U、CV_16S等;

你可能感兴趣的:(openCv,opencv,计算机视觉,matlab)