目录
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<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;
typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> 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等;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/46181.html