55 votes

accès aux éléments multi-canaux

J'essaie d'apprendre à utiliser la nouvelle interface c ++ d'OpenCV.

Comment accéder aux éléments d'une matrice 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
Quel est le moyen le plus efficace? Semblable à l'utilisation de pointeurs directs dans l'ancienne interface.

Je vous remercie

65voto

OwnWaterloo Points 1426
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, canal.
On peut accéder à un élément (ou pixel) dans la matrice par la spécification de la ligne et le col.

CV_32FC2 signifie que l'élément est en 32 bits virgule flottante valeur à 2 canaux.
Donc elem dans 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 quelques nouveaux types pour représenter l'élément dans la matrice,comme :

template<typename _Tp, int cn> class CV_EXPORTS Vec // cxcore.hpp (208)

Donc on peut utiliser Vec<float,2> pour représenter CV_32FC2, ou d'utiliser :

typedef Vec<float, 2> Vec2f; // cxcore.hpp (254)

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

  1. accéder à l'élément

La méthode la plus simple et efficace pour accéder à l'élément dans le Tapis de la classe est Mat::au.
Il dispose de 4 surcharges :

template<typename _Tp> _Tp& at(int y, int x);                // cxcore.hpp (868)
template<typename _Tp> const _Tp& at(int y, int x) const;    // cxcore.hpp (870)
template<typename _Tp> _Tp& at(Point pt);                    // cxcore.hpp (869)
template<typename _Tp> 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<Vec2f>( row , col ); // or m.at<Vec2f>( Point(col,row) );
elem[0] = 1212.0f;
elem[1] = 326.0f;
float c1 = m.at<Vec2f>( row , col )[0]; // or m.at<Vec2f>( Point(col,row) );
float c2 = m.at<Vec2f>( row , col )[1];
m.at<Vec2f>( row, col )[0] = 1986.0f;
m.at<Vec2f>( row, col )[1] = 326.0f;
  1. interagir avec l'ancienne interface

Tapis offre 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_matrix( ... );
CvMat old_matrix = new_matrix;  // be careful about its lifetime
CV_MAT_ELEM(old_mat, elem, row, col).f1 = 1212.0f;

22voto

Ivan Points 91

Vic, vous devez utiliser Vec3b au lieu de Vec3i:

 for (int i=0; i<image.rows; i++)
{
    for (int j=0; j<image.cols; j++)
    {
        if (someArray[i][j] == 0)
        {
            image.at<Vec3b>(i,j)[0] = 0;
            image.at<Vec3b>(i,j)[1] = 0;
            image.at<Vec3b>(i,j)[2] = 0;
        }
    }
}
 

8voto

mithy Points 1221

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

 Mat myMat(size(3, 3), CV_32FC2);

myMat.ptr<float>(y)[2*x]; // first channel
myMat.ptr<float>(y)[2*x+1]; // second channel
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X