2013-06-12 1 views
2

En utilisant trois canaux Mat, nous pouvons accéder à l'élément commeMat monocanal Element accès

Mat draw(480, 480, CV_8UC3); 
Vec3b pix(255,0,0); 
draw.at<Vec3b>(i,j)=pix; 

Mais dans le cas de Mat monocanal comme

Mat draw(480, 480, CV_8UC1); 

comment puis-je accéder à l'élément de Mat. J'ai déjà essayé quelque chose comme

draw.at<float>(i,j)=255; 

mais mauvais résultat. Ai-je tort dans le cas ci-dessus?, Toute aide sera appréciée .....

Merci à l'avance .............

Répondre

3

Ce draw.at<float>(i,j)=255; devrait être

draw.at<uchar>(i,j)=255; 

Vous avez déclaré Mat en tant que type 8 bits unsigned char, 1 canal:

Mat draw(480, 480, CV_8UC1); 

afin d'essayer d'écrire une quantité de 4 octets à un seul conteneur d'octets va provoquer non seulement un résultat incorrect, mais probablement cor ru [d'autres structures de données.

Ce qui suit va écrire (255,0) à 4 octets non 1:

draw.at<float>(i,j)=255; 
+0

Salut merci pour la réponse, j'ai résolu le problème .... – Haris

+0

@ user2151446 cette erreur pouvait-elle produire undefi comportement ned en mode Release avec optimisation complète? juste curieux ... – William

+1

@William Oui - l'écriture draw.at (479,479) = 255 est à une adresse bien passée le buffer d'image alloué donc le comportement à partir de là est indéfini car at() ne fait aucune vérification en mode release . – Bull

1

si vous souhaitez utiliser CV_8UC1 accéder alors un élément dans le tapis serait comme celui-ci

(draw.at<Vec3b>(i,j)).val[k]=255;

où K est le numéro de canal (0 à 3)

Questions connexes