OpenCv矩阵(Mat)的构造
非常方便的构造法查看,帮助你快速掌握Mat构造法:
#include <opencv2\opencv.hpp>
using namespace cv;
template <class T>
void o(int i, T mat)
{
std::cout << i << ":------------------\n" << mat << "\n";
}
void test()
{
Mat I, E;
// (1) Mat::Mat()
o(1, I); ///空矩阵
// (2) Mat::Mat(int rows, int cols, int type)
I = Mat::zeros(2, 2, CV_32FC1);
o(2, I); ///全零矩阵
// (3) Mat::Mat(Size size, int type)
I = Mat::zeros(Size(2, 2), CV_32FC1);
o(3, I); ///全零矩阵
// (4) Mat::Mat(int rows, int cols, int type, constScalar& s)
I = Mat(2, 2, CV_32FC3, Scalar(255, 255, 255));
o(4, I); ///以固定值初始化矩阵
// (5) Mat::Mat(Size size, int type, constScalar& s)
I = Mat(Size(2, 2), CV_32FC2, Scalar(2, 1));
o(5, I); ///以固定值初始化矩阵
// (6) Mat::Mat(const Mat& m)
I = Mat(E);
o(6, I); ///矩阵拷贝
// (7) Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
char INTDATA[6] = {1, 2, 3, -4, 4, -9};
I = Mat(3, 2, CV_8SC1, INTDATA, 2);
o(7, I); ///以数组初始化矩阵
// (8) Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)[略]
// (9) Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
I = Mat(I, Range(0, 1), Range(0, 1));
o(8, I); ///以某矩阵的行限定和列限定初始化矩阵
// (10) Mat::Mat(const Mat& m, const Rect& roi)
I = Mat(I, Rect(0, 0, 1, 1)); ///以ROI初始化矩阵
o(9, I);
// (11) Mat::Mat(const CvMat* m, bool copyData=false)
CvMat * Q = cvCreateMat(2, 2, CV_8SC3);
cvSet(Q, cvScalar(1), 0);
I = Mat(Q);
cvReleaseMat(&Q);
o(10, I); ///CvMat转Mat
// (12) Mat::Mat(const IplImage* img, bool copyData=false)
IplImage *img = cvLoadImage("x.JPG", CV_LOAD_IMAGE_GRAYSCALE);
I = Mat(img);
imshow("te", I); ///IplImage转Mat
cv::waitKey(0);
// (13) template<typename T, int n> explicit Mat::Mat(const Vec<T, n>& vec, bool copyData=true)
const Vec<int, 3> v(1, 2, 3);
I = Mat(v);
o(11, I); ///以Vec初始化矩阵
// (14) template<typename T, int m, int n> explicit Mat::Mat(const Matx<T, m, n>& vec, bool copyData=true)
const Matx23f m(1, 2, 3, 4, 5, 6);
I = Mat(m);
o(12, I); ///以MatxRCf初始化矩阵,RC表示行数与列数
// (15) template<typename T> explicit Mat::Mat(const vector<T>& vec, bool copyData=false)
vector<float> data;
data.push_back(0.2);
data.push_back(0.3);
data.push_back(0.4);
data.push_back(0.5);
I = Mat(data);
o(13, I); ///以float初始化矩阵
data[1] = 3;
o(14, I); ///多数初始化默认不拷贝数据
I = Mat(data, true);
o(15, I); ///第二个参数改为true则会进行数据的拷贝
// (16) Mat::Mat(const MatExpr& expr)
MatExpr t = MatExpr(I.row(0));
I = Mat(t);
o(16, I); ///矩阵的运算返回的结果类型为MatExpr,MatExpr可以直接用来初始化矩阵
// (17) Mat::Mat(int ndims, const int* sizes, int type)
I = Mat(1, 4, CV_8UC1);// 一维数组4的长度
o(17, I);
// (18) Mat::Mat(int ndims, const int* sizes, int type, constScalar& s)[略]
// (19) Mat::Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0)[略]
// (20) Mat::Mat(const Mat& m, const Range* ranges)
I = Mat(3, 2, CV_8SC1, INTDATA, 2); //Range(start, end) 先行后列
o(18, I); ///指定行列存储方式
I = Mat(I, Range(2, 3));
o(19, I); ///行数矩阵
}
输出结果
1:------------------
[]
2:------------------
[0, 0;
0, 0]
3:------------------
[0, 0;
0, 0]
4:------------------
[255, 255, 255, 255, 255, 255;
255, 255, 255, 255, 255, 255]
5:------------------
[2, 1, 2, 1;
2, 1, 2, 1]
6:------------------
[]
7:------------------
[1, 2;
3, -4;
4, -9]
8:------------------
[1]
9:------------------
[1]
10:------------------
[-18, -2, -18, -2, -18, -2;
-18, -2, -18, -2, -18, -2]