2017-09-06 8 views
0

BitmapConverter.csで画像サイズがなぜこれがOpenCVSharp

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

以降(ライン403上)関数が含まれている私たちは、このフラグメントを持っている:

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

は、この図を見ると(darkdragon-001の問題からon the opencv GitHub here)私は上記の行が私たちにイメージサイズを与える理由を理解できませんか?

explanatory image from GitHub

+0

これらの2つはポインタのように見えますが、最初は1つ、もう1つはピクセル配列の最後を過ぎた位置にあります。差を計算すると、配列のサイズが得られます。 –

+0

イメージを含む配列の一部のサイズではありませんか? – dumbledad

+1

文脈が欠落していて、401行目の 'if'文があります。これは、画像が部分行列(すなわち' data == datastart')でなく連続しているときにのみ呼び出されます。 1つの大きな連続したチャンクではない場合は、1行ずつコピーします。 –

答えて

1

このことをよく理解するために、我々はより多くのコンテキストが必要です。

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

[OK]を、ので、これはピクセルデータを含む原料のメモリをコピーを扱うコードです。

これらのステートメントは、場合にのみ実行取得:

  • sstep == dstep - (メモリ内の二つの連続する行の間のオフセット)のステップサイズは、送信元と宛先
  • !submatについても同様である - ソース・イメージではありませんサブマトリックス(それは完全なイメージであり、より大きなもののビューではないので、data == datastartという意味です)。
  • continuous - ソースマトリックスは連続しています(行間のパディングなし)。

は、基礎となる画素アレイがdatastartからdataendにメモリの1つの連続チャンクである場合にのみ実行し、要約します。

この式は、2つのポインタsrc.Datasrc.DataEndの間のバイト数を計算します。

関連する問題