access à un élément multi canal

J’essaie d’apprendre comment utiliser la nouvelle interface c ++ d’OpenCV.

Comment puis-je accéder aux éléments d’une masortingce multicanal. par exemple:

Mat myMat(size(3, 3), CV_32FC2); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 3; ++j) { //myMat_at_(i,j) = (i,j); } } 

Quelle est la manière la plus simple de faire ça? Quelque chose comme cvSet2D de l’ancienne interface
Quelle est la façon la plus efficace? Semblable à l’utilisation de pointeurs directs dans l’ancienne interface.

Je vous remercie

     typedef struct elem_ { float f1; float f2; } elem; elem data[9] = { 0.0f }; CvMat mat = cvMat(3, 3, CV_32FC2, data ); float f1 = CV_MAT_ELEM(mat, elem, row, col).f1; float f2 = CV_MAT_ELEM(mat, elem, row, col).f2; CV_MAT_ELEM(mat, elem, row, col).f1 = 1212.0f; CV_MAT_ELEM(mat, elem, row, col).f2 = 326.0f; 

    Mise à jour: pour OpenCV2.0

    1. choisir un type pour représenter l’élément

    Mat (ou CvMat) a 3 dimensions: row, col, channel.
    Nous pouvons accéder à un élément (ou pixel) dans la masortingce en spécifiant la ligne et la colonne.

    CV_32FC2 signifie que l’élément est une valeur à virgule flottante de 32 bits avec 2 canaux.
    Donc, le code ci-dessus est une représentation acceptable de CV_32FC2 .

    Vous pouvez utiliser d’autres représentations que vous aimez. Par exemple :

     typedef struct elem_ { float val[2]; } elem; typedef struct elem_ { float x;float y; } elem; 

    OpenCV2.0 ajoute de nouveaux types pour représenter l’élément dans la masortingce, comme:

     template class CV_EXPORTS Vec // cxcore.hpp (208) 

    Nous pouvons donc utiliser Vec pour représenter CV_32FC2 ou utiliser:

     typedef Vec Vec2f; // cxcore.hpp (254) 

    Voir le code source pour obtenir plus de type pouvant représenter votre élément.
    Ici, nous utilisons Vec2f

    2. accéder à l’élément

    Le moyen le plus simple et le plus efficace d’accéder à l’élément dans la classe Mat est Mat :: at.
    Il a 4 surcharges:

     template _Tp& at(int y, int x); // cxcore.hpp (868) template const _Tp& at(int y, int x) const; // cxcore.hpp (870) template _Tp& at(Point pt); // cxcore.hpp (869) template const _Tp& at(Point pt) const; // cxcore.hpp (871) // defineded in cxmat.hpp (454-468) // we can access the element like this : Mat m( Size(3,3) , CV_32FC2 ); Vec2f& elem = m.at( row , col ); // or m.at( Point(col,row) ); elem[0] = 1212.0f; elem[1] = 326.0f; float c1 = m.at( row , col )[0]; // or m.at( Point(col,row) ); float c2 = m.at( row , col )[1]; m.at( row, col )[0] = 1986.0f; m.at( row, col )[1] = 326.0f; 

    3. interagir avec l’ancienne interface

    Mat fournit 2 fonctions de conversion:

     // converts header to CvMat; no data is copied // cxcore.hpp (829) operator CvMat() const; // defined in cxmat.hpp // converts header to IplImage; no data is copied operator IplImage() const; // we can interact a Mat object with old interface : Mat new_masortingx( ... ); CvMat old_masortingx = new_masortingx; // be careful about its lifetime CV_MAT_ELEM(old_mat, elem, row, col).f1 = 1212.0f; 

    Vic, vous devez utiliser Vec3b au lieu de Vec3i:

     for (int i=0; i(i,j)[0] = 0; image.at(i,j)[1] = 0; image.at(i,j)[2] = 0; } } } 

    Vous pouvez accéder directement au tableau de données sous-jacent:

     Mat myMat(size(3, 3), CV_32FC2); myMat.ptr(y)[2*x]; // first channel myMat.ptr(y)[2*x+1]; // second channel 

    cela dépend du type de données du Mat que vous utilisez, si c’est numérique comme CV_32FC1, vous pouvez utiliser:

     myMat.at(i, j) 

    si c’est un type uchar, vous pouvez accéder à un élément en utilisant

     (symb.at(i, j)).val[k] 

    où k est le canal, c’est 0 pour les images en niveaux de gris et 3 pour les images en couleur

    Le meilleur moyen d’accéder au tableau multi-canaux avec l’API c ++ consiste à créer un pointeur sur une ligne spécifique à l’aide de la méthode ptr.

    Par exemple;

    type elem = masortingx.ptr(i)[N~c~*j+c]

    • type : le type de données (float, int, char ect ..)
    • i : rangée qui vous intéresse
    • Nc : le nombre de canaux
    • j : la colonne qui vous intéresse
    • c : la colonne qui vous intéresse (0-3)

    Pour plus d’informations sur d’autres conversions c-> c ++, consultez ce lien: Source