一,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;