Почему такой размер изображения в 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 здесь) Я не могу понять, почему строка выше дает нам размер изображения?

пояснительное изображение с GitHub


person dumbledad    schedule 06.09.2017    source источник
comment
Эти два выглядят как указатели, один на начало, другой на позицию сразу за концом массива пикселей. Вычисление разницы дает вам размер массива.   -  person Dan Mašek    schedule 06.09.2017
comment
А не размер части массива, содержащей изображение?   -  person dumbledad    schedule 06.09.2017
comment
Отсутствует немного контекста, оператор if в строке 401. Он вызывается только тогда, когда изображение не является подматрицей (т.е. data == datastart) и когда оно непрерывно. Когда это не просто один большой непрерывный кусок, он идет и копирует строку за строкой.   -  person Dan Mašek    schedule 06.09.2017
comment
Спасибо @DanMašek, если вы напишете это как ответ, я отмечу это так   -  person dumbledad    schedule 06.09.2017


Ответы (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 -- Исходная матрица непрерывна (без отступов между строками).

Подводя итог, можно сказать, что он работает только тогда, когда базовый массив пикселей представляет собой один непрерывный фрагмент памяти от datastart до dataend.

Таким образом, это выражение вычисляет количество байтов между двумя указателями src.Data и src.DataEnd.

person Dan Mašek    schedule 06.09.2017