1、制作不必要的潜在大副本会进一步降低程序的速度
①每个Mat对象都有自己的标头,但是可以通过让它们的矩阵指针指向同一地址在两个 Mat 对象之间共享矩阵。此外,复制运算符只会复制指向大矩阵的标头和指针,而不是数据本身。
- 复制构造函数
- 赋值运算符
②创建仅引用完整数据的子部分。例如,要在图像中创建感兴趣区域 (ROI),您只需创建一个具有新边界的新标头:
③有时想复制矩阵本身(完整数据即底层矩阵),现在修改F或G不会影响 A 标头指向的矩阵。
2、颜色系统
①RGB:是最常见的,因为我们的眼睛使用类似的东西,但请记住,OpenCV标准显示系统使用BGR色彩空间(红色和蓝色通道交换位置)组成颜色。
②HSV和HLS:将颜色分解为色调、饱和度和值/亮度分量,这是我们描述颜色的一种更自然的方式。例如,您可能会忽略最后一个组件,从而使您的算法对输入图像的光照条件不太敏感。
③YCrCB:被流行的JPEG图像格式使用
④CIE:L*a*b是一个感知均匀的颜色空间,如果您需要测量给定颜色到另一种颜色的距离,它会派上用场。
图像矩阵的大小取决于使用的颜色系统。更准确的说,它取决于通道数。每个都有自己的有效域。这会导致使用的数据类型不同。我们如何存储组件定义了我们对其域的控制。可能的最小数据类型是 char,这意味着一个字节或 8 位。这可能是无符号的(因此可以存储从 0 到 255 的值)或有符号的(从 -127 到 +127 的值)。尽管在三个分量(如 RGB)的情况下,这个宽度已经提供了 16 万种可能的颜色来表示,但我们可以通过为每个分量使用浮点数(4 字节 = 32 位)或双精度(8 字节 = 64 位)数据类型来获得更精细的控制。不过,请记住,增加组件的大小也会增加内存中整个图片的大小
可以指定图像的数据类型
组成都是CV_+深度+通道,其中里面的数字8 ,16,32 标识的是深度,例如:
- CV_8U是无符号8位/像素,即一个像素可以有0-255的值,这是大多数图像和视频格式的正常范围。
- CV_32F是float-像素可以有0-1.0之间的任何值,这对于某些数据集的计算很有用,但必须将其转换为8位才能通过将每个像素乘以255来保存或显示。
- CV_32S是每个像素的一个有符号32位整数值-同样有用的是,您正在对像素进行整数运算,但同样需要转换为8位才能保存或显示。因为您需要决定如何转换更大范围的可能值(+/-20亿!)变成0-255
3、创建一个Mat类型的对象
①cv::Mat::Mat Constructor(Mat构造函数)
Scalar:指定它,您就可以使用自定义值初始化所有矩阵点。如果需要更多,可以使用上部宏创建类型,在括号中设置通道编号,如下所示。
②使用 C/C++ 数组并通过构造函数初始化
③cv::Mat::create function这种方法不能用来构造初始化矩阵值,只有当新尺寸不适合旧尺寸时,它才会重新分配其矩阵数据存储器。
④MATLAB 样式初始值设定项,cv::Mat::zeros(零矩阵) , cv::Mat::ones(1矩阵) , cv::Mat::eye(对角矩阵)
⑤对小矩阵,可直接使用逗号分隔数据
⑥为现有 Mat 对象创建一个新的标头,然后cv::Mat::clone or cv::Mat::copyTo它
⑦可以使用cv::randu()函数用随机值填充矩阵,需要为随机值指定上下限:
4、格式化矩阵输出
5、其它输出形式
①2D:
②3D:
③vector<Vec4i>hierarchy:数组容器,里面放的是4个int的整数。
vector h ,一次只放一个整数,赋值一个int
vector h1, 一次放四个整数。给它赋一个 vec4i就可以