2017-09-06 1 views
0

BitmapConverter.cs inclut la fonctionPourquoi est-ce la taille de l'image dans OpenCVSharp

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

plus tard (à la ligne 403), nous avons ce fragment:

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

En regardant ce diagramme (du numéro de DarkDragon-001 sur l'opencv GitHub here) Je ne peux pas comprendre pourquoi la ligne ci-dessus nous obtient la taille de l'image?

explanatory image from GitHub

+0

Ces deux points ressemblent à des pointeurs, l'un vers le début, l'autre vers la position juste après la fin de la matrice de pixels. Le calcul de la différence vous donne la taille du tableau. –

+0

Mais pas la taille de la partie du tableau contenant l'image? – dumbledad

+1

Il manque un peu de contexte, l'instruction 'if' sur la ligne 401. Elle est appelée uniquement lorsque l'image n'est pas une sous-matrice (c'est-à-dire' data == datastart') et lorsqu'elle est continue. Quand ce n'est pas juste un gros morceau contigu, il va et copie rangée par rangée. –

Répondre

1

Pour mieux comprendre cela, nous avons besoin de plus de contexte:

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

Ok, donc c'est un code qui traite de la copie de la mémoire brute contenant les données de pixels.

Ces déclarations sont exécutées que lorsque:

  • sstep == dstep - La taille de l'étape (décalage entre deux lignes consécutives dans la mémoire) est le même pour la source et la destination
  • !submat - L'image source est non une sous-matrice (ce qui signifie que c'est une image complète, pas une vue d'une plus grande, et donc data == datastart).
  • continuous - La matrice source est continue (pas de remplissage entre les lignes).

Pour résumer, il ne fonctionne que lorsque la matrice de pixels sous-jacent est un morceau contigu de mémoire datastart-dataend. Donc, cette expression calcule le nombre d'octets entre les deux pointeurs src.Data et src.DataEnd.