OpenCv矩阵(Mat)的构造

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]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值