什么是连续数组

What is a continuous array?

本文关键字:数组 连续 什么      更新时间:2023-10-16

在OpenCV文档中,提到了连续数组。

"检查所有输入/输出阵列是否连续,即每行末尾是否没有间隙,这是有意义的。"

在每一行的末尾都没有间隙意味着什么。有人能举例说明吗?

在我看来,一个更好的词应该是"连续的"。

位图有一个"步长"的概念。"步长"使位图/像素图符合底层硬件或软件的特定对齐限制。"步幅"(也称为"间距")是一条扫描线的第一个字节与下一条扫描行的第一个字符之间的距离。位图/像素图阵列的总大小是间距乘以行数。

由于几个原因,间距不必与"sizeof(pixel)*width"相同。

第一个原因是数据必须对齐。例如,当一个像素是3个字节,并且扫描线必须对齐4个字节时,那么一个3像素宽的位图每个扫描线将包含9个字节的像素数据,但对齐将四舍五入到4的最接近的高倍数,这使其间距为12个字节。末尾的"额外"数据会使您发布的描述中的每条扫描线不"连续"。

另一个原因是,当你有一个更大的位图,比如1024x1024图片,然后从中提取一个子图片,比如128x64区域。您可以与原始位图共享数据,而不是复制数据,然后将"宽度"设置为128个像素,将"高度"设置为64个像素,设置"数据"指针指向子区域的第一个像素,并将步幅/间距设置为1024像素位图的步幅/节距——这样,您就可以指向同一位图数据中不同大小的多个区域。

当分配给OpenCV数组的所有内存都按顺序组织时,它是连续的。换句话说,不存在被这样的数组包围的变量:数组(图像、矩阵等)可以被视为一个"单行"向量。

cv::Mat中有一个叫做isContinuous的方法来检查一个是否是连续的。从文件来看,解释它的引用:

该方法用于相当多的OpenCV函数中。关键是元素操作(如算术和逻辑运算、数学函数、alpha混合、颜色空间变换等)不依赖于图像几何体。因此,如果所有的输入和输出数组都是连续的,则函数可以将它们处理为非常长的单行向量。

在文档中寻找一个完整的解释(带示例)。