Comment modifier une partie de la masortingce multi-dimensionnelle avec openCV?

Je souhaite modifier une partie d’une masortingce multidimensionnelle à l’aide de openCV. En gros, je veux obtenir le même résultat que celui écrit dans Matlab:

A = zeros(5,5,25); A(:,:,1) = some_masortingx1; A(:,:,2) = some_masortingx2; 

Je ne sais pas si je devrais utiliser une masortingce 5×5 avec 25 canaux ou une masortingce 5x5x25 avec un seul canal. Voici ce que j’ai essayé:

 int dim[3] = { 5,5,25 }; Mat A(3, dim, CV_32FC(1), Scalar::all(0)); A(Range::all(),Range::all(),0) = some_masortingx; 

Mais il semble que je ne peux utiliser Range que pour deux dimensions. Ou

 Mat A(5, 5, CV_32FC(25), Scalar::all(0)); A(Range::all(),Range::all())[0] = some_masortingx; 

Mais dans ce cas, je ne sais pas comment accéder au canal. Pouvez-vous m’aider s’il vous plaît?

OpenCV est optimisé pour les masortingces 2D. Une masortingce multidimensionnelle fonctionnera, mais est plutôt inefficace et difficile d’access.

Cet exemple de code vous montrera comment écrire et lire les valeurs d’une masortingce 3D:

 #include  using namespace cv; int main() { int sizes[] = { 5, 5, 25 }; Mat data(3, sizes, CV_32F); Mat1f some_masortingx(sizes[0], sizes[1]); randu(some_masortingx, 0.f, 100.f); // some random values // Init data with each plane a constant increasing value for (int z = 0; z < data.size[2]; ++z) { // Set each z-plane to some scalar value Range ranges[] = { Range::all(), Range::all(), Range(z, z + 1) }; data(ranges) = data.size[2] - z; } // Set the n-th z-plane to some_matrix int z = 0; for (int r = 0; r < sizes[0]; ++r) { for (int c = 0; c < sizes[1]; ++c) { data.at(r, c, z) = some_masortingx(r, c); } } // Access all slices along z dimension for (int z = 0; z < data.size[2]; ++z) { Range ranges[] = { Range::all(), Range::all(), Range(z, z + 1) }; Mat slice3d(data(ranges).clone()); // with clone slice is continuous, but still 3d Mat slice(2, &data.size[0], data.type(), slice3d.data); } return 0; } 

Cependant, il est beaucoup plus facile et pratique de stocker votre masortingce 3D 5x5x25 en tant que std::vector , où le vector a une longueur de 25 et chaque masortingce est un 2D 5x5.

Voir le code:

 #include  using namespace cv; int main() { int sizes[] = { 5, 5, 25 }; vector data(sizes[2]); // Init data with each plane a constant increasing value for (int z = 0; z < sizes[2]; ++z) { data[z] = Mat(sizes[0], sizes[1], CV_32F, float(sizes[2] - z)); } Mat1f some_matrix(sizes[0], sizes[1]); randu(some_matrix, 0.f, 100.f); // some random values // Set the n-th z-plane to some_matrix int z = 0; data[z] = some_matrix; return 0; } 

Voici le morceau de code pour accéder au pixel depuis le canal, vous pouvez l’essayer.

 int dim[3] = { 5,5,25 }; Mat A(3, dim, CV_32FC1, Scalar::all(0)); for (int m = 0; m < 5; m++) { for (int n = 0; n < 5; n++) { for (int a = 0; a < 25; a++) // no of channels { cout << A.at(m,n)[a] << endl; } } }