【opencv-c++】4.1-4.2 图像和大型数组类型

4.1-4.2 图像和大型数组类型

动态可变的存储

我们将进入大型数组类型的世界,它们之中最主要的当属c v::Mat,这个结构可以视为是OpenCV所有C++实现的核心,OpenCV所有主要函数都或是c v::Mat类的成员,或是将cv::Mat作为参数,或是返回一个cv::Mat类型。很少有函数和这三者都没有关系。

cv::Ma t类用于表示任意维度的稠密数组。“稠密”表示该数组的所有部分都有一个值存储,即使这个值是0。对于大多数图像来说,都是以稠密数组的形式存储的;与此相对的当然还有稀疏数组,在spare array中被实现,稀疏数组中只有非0的数值会被存储。从结论上来说,如果数组的很多地方都是0,那么稀疏数组会非常节约内存。但是在数组比较稠密的时候,稀疏数组反而会浪费大量内存。一个常用的使用稀疏数组比稠密数组好的例子是,统计直方图大部分直方图的大部分数值都为0,我们没有必要存储所有值为0的部分。

cv::Mat类N维稠密数组

cv ::Mat类可以作为任意维度的数组使用,其数据可以看做是以按照栅格扫描顺序存储的n维数组。这意味着在一维数组中,元素是按顺序排列的;而在一个二维数组中,数据按行组织,每一行也按顺序排列,对于三维数组来说,所有的通道都被行填充,每一个通道同样按顺序排列。

所有的矩阵都含有一个表示它所包含数组类型的元素flag,一个表示其维度的元素dims,分别表示行和列的数目的元素rows和cols(在dims大于2的时候无效),一个指示数据真正存储位置的data指针,以及一个表示该内存区域有多少个引用的refcount元素,类似于cv::Ptr<>的引用计数器。这个成员cv::Ma t像智能指针一样管理内存区域。数据实体data的结构被step[]所描述。数据数组按如下公式来排列数据:

4.1 创建一个数组


4.2 独立获取数组元素


posted @ 2022-04-26 10:05  野哥李  阅读(12)  评论(0编辑  收藏  举报  来源