Multi-Dimensionnelle des données dans une Matrice en OpenCV avec C++
Je veux déclarer, le remplir, l'accès Multi-Dimensions de la Matrice dans OpenCV (C++) qui est compatible avec espace de noms cv. Je n'ai pas trouvé facile et rapide à apprendre des exemples sur eux. Pouvez-vous svp m'aider?
Voici un court exemple de la NAryMatIterator de la documentation; il montre comment créer, remplir et des processus multi-dimensions de la matrice dans OpenCV:
void computeNormalizedColorHist(constMat& image,Mat& hist,int N,double minProb){constint histSize[]={N, N, N};//make sure that the histogram has a proper size and type
hist.create(3, histSize, CV_32F);//and clear it
hist =Scalar(0);//the loop below assumes that the image//is a 8-bit 3-channel. check it.
CV_Assert(image.type()== CV_8UC3);MatConstIterator_<Vec3b> it = image.begin<Vec3b>(),
it_end = image.end<Vec3b>();for(; it != it_end;++it ){constVec3b& pix =*it;
hist.at<float>(pix[0]*N/256, pix[1]*N/256, pix[2]*N/256)+=1.f;}
minProb *= image.rows*image.cols;Mat plane;NAryMatIterator it(&hist,&plane,1);double s =0;//iterate through the matrix. on each iteration//it.planes[*] (of type Mat) will be set to the current plane.for(int p =0; p < it.nplanes; p++,++it){
threshold(it.planes[0], it.planes[0], minProb,0, THRESH_TOZERO);
s += sum(it.planes[0])[0];}
s =1./s;
it =NAryMatIterator(&hist,&plane,1);for(int p =0; p < it.nplanes; p++,++it)
it.planes[0]*= s;}
Aussi, découvrez le cv::compareHist fonction pour un autre exemple d'utilisation de la NAryMatIteratorici.
Donc un 3-dimensions tableau doit être quelque chose de ce genre? int sz[] = {3, 3, 3}; Tapis de accumarray(3, sz, CV_8U, Scalar:: (0)); accumarray.at<char>(0, 1, 2) = 20; Oui. Qui devrait fonctionner parfaitement. Eh bien, il semble que la méthode ci-dessus ne fonctionne pas pour les 4 dimensions de la Matrice. Savez-vous la raison? qu'est-ce que le paramètre minProb ?
Pour créer un multi-dimensions de la matrice est de taille 100x100x3, à l'aide de flotteurs, un canal, et avec tous les éléments initialisés à 10 vous écrire comme ceci:
int size[3]={100,100,3};
cv::Mat M(3, size, CV_32FC1, cv::Scalar(10));
Boucle de sortie et les éléments de la matrice que vous pouvez faire:
for(int i =0; i <100; i++)for(int j =0; j <100; j++)for(int k =0; k <3; k++)
std::cout << M.at<cv::Vec3f>(i,j)[k]<<", ";
Voici un court exemple de la NAryMatIterator de la documentation; il montre comment créer, remplir et des processus multi-dimensions de la matrice dans OpenCV:
Aussi, découvrez le
cv::compareHist
fonction pour un autre exemple d'utilisation de laNAryMatIterator
ici.Oui. Qui devrait fonctionner parfaitement.
Eh bien, il semble que la méthode ci-dessus ne fonctionne pas pour les 4 dimensions de la Matrice. Savez-vous la raison?
qu'est-ce que le paramètre minProb ?
OriginalL'auteur mevatron
Pour créer un multi-dimensions de la matrice est de taille 100x100x3, à l'aide de flotteurs, un canal, et avec tous les éléments initialisés à 10 vous écrire comme ceci:
Boucle de sortie et les éléments de la matrice que vous pouvez faire:
Cependant, méfiez-vous des problèmes avec l'utilisation de multi-dimensions des matrices, comme indiqué ici: Comment puis-je obtenir la taille d'un multi-dimensionnelle cv::Mat? (Mat, ou MatND)
OriginalL'auteur Reed Richards