opencv 笔记01Core_Mat

Mat - 基本图像容器

Mat A, C;                                 // 只创建信息头部分
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 这里为矩阵开辟内存
Mat B(A);                                 // 使用拷贝构造函数
C = A; 
以上代码中的所有Mat对象最终都指向同一个也是唯一一个数据矩阵。虽然它们的信息头不同,但通过任何一个对象所做的改变也会影响其它对象。实际上,不同的对象只是访问相同数据的不同途径而已。这里还要提及一个比较棒的功能:你可以创建只引用部分数据的信息头。比如想要创建一个感兴趣区域(  ROI  ),你只需要创建包含边界信息的信息头:
Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
Mat E = A(Range:all(), Range(1,3)); // using row and column boundaries

如果矩阵属于多个 Mat 对象,那么当不再需要它时谁来负责清理?简单的回答是:最后一个使用它的对象
但某些时候你仍会想拷贝矩阵本身(不只是信息头和矩阵指针),这时可以使用函数 clone() 或者 copyTo() 。
Mat F = A.clone();
Mat G;
A.copyTo(G);

总结一下,你需要记住的:
  • OpenCV函数中输出图像的内存分配是自动完成的(如果不特别指定的话)。
  • 使用OpenCV的C++接口时不需要考虑内存释放问题。
  • 赋值运算符和拷贝构造函数( ctor )只拷贝信息头。
  • 使用函数 clone() 或者 copyTo() 来拷贝一副图像的矩阵。

存储 方法


有很多的颜色系统,各有自身优势:

  • RGB是最常见的,这是因为人眼采用相似的工作机制,它也被显示设备所采用。
  • HSV和HLS把颜色分解成色调、饱和度和亮度/明度。这是描述颜色更自然的方式,比如可以通过抛弃最后一个元素,使算法对输入图像的光照条件不敏感。
  • YCrCb在JPEG图像格式中广泛使用。
  • CIE L*a*b*是一种在感知上均匀的颜色空间,它适合用来度量两个颜色之间的 距离 。

每个组成元素都有其自己的定义域,取决于其数据类型。如何存储一个元素决定了我们在其定义域上能够控制的精度。最小的数据类型是 char ,占一个字节或者8位,可以是有符号型(0到255之间)或无符号型(-127到+127之间)。尽管使用三个 char 型元素已经可以表示1600万种可能的颜色(使用RGB颜色空间),但若使用float(4字节,32位)或double(8字节,64位)则能给出更加精细的颜色分辨能力。但同时也要切记增加元素的尺寸也会增加了图像所占的内存空间。

显式地创建一个 Mat 对象

Mat M(2,2, CV_8UC3, Scalar(0,0,255)); 
CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
比如  CV_8UC3  表示使用8位的 unsigned char 型,每个像素由三个元素组成三通道。
Scalar  是个short型vector。指定这个能够使用指定的定制化值来初始化矩阵。

int sz[3] = {2,2,2}; 
Mat L(3,sz, CV_8UC(1), Scalar::all(0));
上面的例子演示了如何创建一个超过两维的矩阵:指定维数,然后传递一个指向一个数组的指针,这个数组包含每个维度的尺寸;其余的相同
  • 为已存在IplImage指针创建信息头:

    IplImage* img = cvLoadImage("greatwave.png", 1);
    Mat mtx(img); // convert IplImage* -> Mat
    
  • Create() function: 函数

        M.create(4,4, CV_8UC(2));
        cout << "M = "<< endl << " "  << M << endl << endl;
  • MATLAB形式的初始化方式: zeros()ones(), :eyes() 。使用以下方式指定尺寸和数据类型:

    Mat E = Mat::eye(4, 4, CV_64F);    
    
    Mat O = Mat::ones(2, 2, CV_32F);    

    Mat Z = Mat::zeros(3,3, CV_8UC1);

  • 对于小矩阵你可以用逗号分隔的初始化函数:

    Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); 

格式化打印


  • 默认方式

        cout << "R (default) = " << endl <<        R           << endl << endl;
    
    Default Output
  • 以逗号分隔的数值 (CSV)

        cout << "R (csv)     = " << endl << format(R,"csv"   ) << endl << endl;
    
    Default Output
  • Numpy

        cout << "R (numpy)   = " << endl << format(R,"numpy" ) << endl << endl;
    
    Default Output
  • C语言

        cout << "R (c)       = " << endl << format(R,"C"     ) << endl << endl;
    
    Default Output

  • 2维点

        Point2f P(5, 1);
        cout << "Point (2D) = " << P << endl << endl;
    
    Default Output
  • 3维点

        Point3f P3f(2, 6, 7);
        cout << "Point (3D) = " << P3f << endl << endl;
    
    Default Output
  • 基于cv::Mat的std::vector

        vector<float> v;
        v.push_back( (float)CV_PI);   v.push_back(2);    v.push_back(3.01f);
        
        cout << "Vector of floats via Mat = " << Mat(v) << endl << endl;
    
    Default Output
  • std::vector点

        vector<Point2f> vPoints(20);
        for (size_t E = 0; E < vPoints.size(); ++E)
            vPoints[E] = Point2f((float)(E * 5), (float)(E % 7));
    
        cout << "A vector of 2D Points = " << vPoints << endl << endl;
    
    Default Output


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值