opencv之Mat

来源:互联网 发布:gblive是什么直播软件 编辑:程序博客网 时间:2024/06/05 11:07

一,Mat类型简介

主要特点:

1,不用手动管理内存,当然要是喜欢手动也可以

2,拷贝构造和赋值构造只拷贝信息头和矩阵指针,多个指针指向同一块图像内存。同时,对每个Mat对象操作都会改变数据。

3,使用引用计数机制,最后一个对象负责销毁内存(智能指针)

4,需要拷贝内存内容而不是数据头信息的时候用copyto()和clone()两个函数

二,存储方法

几种常见颜色系统:

1,RGB是最常见的,这是因为人眼采用相似的工作机制,它也被显示设备所采用  

2,HSV和HLS把颜色分解成色调、饱和度和亮度/明度。这是描述颜色更自然的方式,比如可以通过抛弃最后一个元素,使算法      对输入图像的光照条件不敏感。

3,YCrCb在JPEG图像格式中广泛使用

4,CIE L*a*b*是一种在感知上均匀的颜色空间,它适合用来度量两个颜色之间的 距离 。

三,显式地创建一个 Mat 对象

Mat() 构造函数

Mat M(2,2, CV_8UC3, Scalar(0,0,255)); 

对于二维多通道图像,首先要定义其尺寸,即行数和列数。然后,需要指定存储元素的数据类型以及每个矩阵点的通道数

CV_8UC3 表示使用8位的 unsigned char 型,每个像素由三个元素组成三通道,定义规则:

CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]

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);        cout << "E = " << endl << " " << E << endl << endl;        Mat O = Mat::ones(2, 2, CV_32F);        cout << "O = " << endl << " " << O << endl << endl;    Mat Z = Mat::zeros(3,3, CV_8UC1);    cout << "Z = " << endl << " " << Z << endl << endl;

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

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

使用 clone() 或者 copyTo() 为一个存在的 Mat 对象创建一个新的信息头。

    Mat RowClone = C.row(1).clone();    cout << "RowClone = " << endl << " " << RowClone << endl << endl;

四,格式化打印

调用函数 randu() 来对一个矩阵使用随机数填充,需要指定随机数的上界和下界:

    Mat R = Mat(3, 2, CV_8UC3);    randu(R, Scalar::all(0), Scalar::all(255));

默认方式:

    cout << "R (default) = " << endl <<        R           << endl << endl;

2维点

Point2f P(5, 1);    cout << "Point (2D) = " << P << endl << endl;

3维点

 Point3f P3f(2, 6, 7);    cout << "Point (3D) = " << P3f << endl << endl;

基于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;

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;


0 0