什么是连续阵列?

时间:2015-06-29 03:06:53

标签: c++ arrays opencv

OpenCV documentation中,提到了连续数组。

  

“检查所有输入/输出数组是否连续是有意义的,即每行末尾没有间隙。”

每行末尾没有间隙是什么意思。有人可以用一个例子解释一下吗?

2 个答案:

答案 0 :(得分:3)

在我看来,一个更好的词将是“连续的”。

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

由于多种原因,音高不必与“sizeof(像素)*宽度”相同。

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

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

答案 1 :(得分:3)

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

isContinuous中有一个名为cv::Mat的方法来检查一个是否是连续的。从文档中,解释它的引用:

  

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

documentation中寻找完整的解释(带示例)。