6
votes

Écrire à iplimage ImageData

Je veux écrire des données directement dans la matrice ImageData d'un iplimage, mais je ne trouve pas beaucoup d'informations sur la manière dont elle est formatée. Une chose qui me trouble particulièrement est que, malgré la création d'une image avec trois canaux, il y a quatre octets à chaque pixel.

La fonction que j'utilise pour créer l'image est la suivante: xxx

Par toutes les indications, cela devrait créer une image RVB à trois canaux, mais cela ne semble pas être le cas.

Comment irait-il, par exemple, écrire un pixel rouge unique à celui-là Image?

Merci pour une aide, ça me fait bouer.


2 commentaires

Stackoverflow.com/Questtions/6868723/...


Cette réponse suppose qu'il y aura en fait trois bits par pixel. J'ai confirmé que Nhannels de mon image est 3, mais il y a encore 4 bits pour chaque pixel. Pour ce que ça vaut la peine, ils ne sont pas réellement regroupés avec les pixels. Ils semblent être stockés à la fin de chaque rangée, tous réglés à 0.


3 Réponses :


0
votes

Unsigned Char * ImageData = [R1, G1, B1, R2, G2, B2, ..., RN, BN, GN]; // n = hauteur * largeur de l'image Cadre-> ImageData = ImageData.

Prenez votre image qui est une matrice dimensionnelle de hauteur N et de largeur m et dorez-la dans un vecteur de longueur sage de ligne N * m. Faites ceci de type Sans signé Char * pour ipl_depth_8u images.


3 commentaires

Le problème est qu'il y a quatre octets à chaque pixel. Les octets supplémentaires semblent être regroupés à la fin de chaque rangée et sont tous réglés à zéro, mais je ne sais pas pourquoi. En outre, je ne sais pas si c'est important, mais les images semblent être stockées dans BGR, pas RVB.


Pas sûr des 4 octets supplémentaires? Comment voyez-vous cela? Essayez d'assigner à l'imagerata à un tableau Char * de toute façon. C'est ce qui fonctionne pour moi. Oui Certaines bibliothèques C ++ utilisent BGR et certains utilisent RVB. Si les couches de couleurs ont l'air commutée lorsque vous affichez, utilisez CVCVTColor (cadre, cadre, CV_BRG2RGB) pour changer les calques R et B.


La taille de l'image est systématiquement égale à 4 * nombre de pixels. J'ai trouvé les positions simplement en imprimant le tableau d'imagétata en essayant de déterminer la manière dont les données ont été stockées. Quoi qu'il en soit, je vais essayer ça.



8
votes

Si vous envisagez image-> ImageSize Gardez à l'esprit que c'est Cadre-> Hauteur * Cadre-> WidthStep , pas Cadre-> Hauteur * cadre-> largeur .

BGR est le format natif de OpenCV, pas RVB.

De plus, si vous venez de commencer, vous devez envisager d'utiliser l'interface C ++ (où remplace le tapis iplimage) car c'est la direction future. Et il est beaucoup plus facile de travailler avec.

Voici quelques échantillons de code qui accède directement aux données de pixels: xxx


2 commentaires

Merci pour ça. J'ai finalement découvert cela, avait été aveuglé par le malheureux fait que pour une et deux lignes de pixels, que j'ai utilisé dans les tests, l'arronçage de la ligne ajoute une et deux pixels respectivement. Je vais regarder le tapis, dans la navigation, il semblait être un système plus opaque, mais je suppose que c'est juste un manque de familiarité.


Je ne suis pas une autorité mondiale sur Opencv, mais je ne vois pas où le tapis est plus opaque que Iplimage. Et les cloches et sifflets C ++ comme la surcharge de l'opérateur facilitent le fonctionnement. La documentation est chez OpenCV.itseez.com/modules/core/doc/ basic_tructures.html # mat



0
votes

droit à votre réponse, peignant le pixel rouge: xxx


0 commentaires