为什么这是 OpenCVSharp 中的图像大小

Why is this the image size in OpenCVSharp

BitmapConverter.cs 包含函数

public static unsafe void ToBitmap(this Mat src, Bitmap dst)

稍后(在第 403 行)我们有这个片段:

uint imageSize = (uint)(src.DataEnd.ToInt64() - src.Data.ToInt64());

看这张图(来自 darkdragon-001 在 opencv 上的问题 GitHub here)我不明白为什么上面的行让我们得到图像大小?

为了更好地理解这一点,我们需要更多上下文:

// ....
if (sstep == dstep && !submat && continuous)
{
    uint imageSize = (uint)(src.DataEnd.ToInt64() - src.Data.ToInt64());
    MemoryHelper.CopyMemory(pDst, pSrc, imageSize);
}
// ...

好的,这是处理复制包含像素数据的原始内存的代码。

这些语句仅在以下情况下执行:

  • sstep == dstep -- 源和目标的步长(内存中两个连续行之间的偏移量)相同
  • !submat -- 源图像不是子矩阵(意味着它是完整图像,而不是更大图像的视图,因此 data == datastart)。
  • continuous -- 源矩阵是连续的(行与行之间没有填充)。

总而言之,它仅在底层像素阵列是从 datastartdataend 的一个连续内存块时运行。

因此该表达式计算两个指针 src.Datasrc.DataEnd 之间的字节数。