【问题标题】:Why is this the image size in OpenCVSharp为什么这是 OpenCVSharp 中的图像大小
【发布时间】:2017-09-07 01:54:48
【问题描述】:

BitmapConverter.cs包含函数

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

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

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

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

【问题讨论】:

  • 这两个看起来像指针,一个指向开头,另一个指向刚刚超过像素数组末尾的位置。计算差值可以得到数组的大小。
  • 但不是包含图像的数组部分的大小?
  • 缺少一些上下文,第 401 行的if 语句。仅当图像不是子矩阵(即data == datastart)并且它是连续的时才会调用。当它不仅仅是一个大的连续块时,它会逐行复制。
  • 谢谢@DanMašek,如果你把它写成答案,我会这样标记它

标签: opencv opencvsharp


【解决方案1】:

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

// ....
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 之间的字节数。

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2015-02-13
    • 2022-01-26
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2016-04-24
    相关资源
    最近更新 更多