Je dois faire la transposée d'une image sur une matrice non carré
J'ai fais ceci comme code mais j'ai comme message d'erreur due au makefile de mon prof : Valgrind has detected a memory corruption !
Mat transpose(Mat image)
{
Mat res = Mat::zeros(1,1,CV_32FC1);
/********************************************
YOUR CODE HERE
hint: consider a non square image
*********************************************/
for(int i = 0; i < image.rows; i++)
{
for(int j = 0; j < image.cols; j++)
{
res.at<float>(j,i) = image.at<float>(i,j);
}
}
/********************************************
END OF YOUR CODE
*********************************************/
return res;
}
Mais je ne comprends pas où est l'erreur... j'imagine que ca doit etre bete..
Si la matrice image est de taille rows*cols, il faut que la matrice res soit de taille cols*rows
D'ailleurs, je n'avais pas fait attention mais tu travailles sur une matrice 1*1, il faut la redimensionner.
Sinon, deux point sur l'optimisation:
inutile de l'initialiser à 1*1 si c'est pour la réallouer dans tous les cas (mais si je comprend bien c'est un bout de code du prof...).
Il est préférable de passer la matrice à transposer par référence constante et ainsi éviter une copie inutile.
- Edité par Orochi il y a 3 minutes
je te remercie !
j ai fait ca mais j ai toujours un probleme de mémoire :(
Mat transpose(Mat image)
{
Mat res = Mat::zeros(1,1,CV_32FC1);
//cout << res << endl;
/********************************************
YOUR CODE HERE
hint: consider a non square image
*********************************************/
res.cols = image.rows;
res.rows = image.cols;
for(int i = 0; i < image.rows; i++)
{
for(int j = 0; j < image.cols; j++)
{
res.at<float>(j,i) = image.at<float>(i,j);
}
}
/********************************************
END OF YOUR CODE
*********************************************/
return res;
}
Coucou! Il me semble qu'openCV est column-major, ce qui signifie que
image.at<float>(i,j)
i représente les colonnes et j représente les lignes, tu as fais l'inverse.
Tu devrais utiliser un débogueur pour voir à partir de quand tu as l'erreur, ça t'aiderai a comprendre je pense :/ (ou au moins afficher i et j, ainsi que la taille des images, histoire de voir ce quelle valeur va avec quelle quelle variable )
- Edité par KirbXCoucou 20 mars 2018 à 17:04:57
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. » D. Mendeleïev
Quand tu construis une matrice, le construteur alloue de la mémoire pour cols*rows éléments donc si tu déclares une matrice 1*1 puis que tu changes la valeur de rows et cols à la main, la mémoire n'a toujours pas bougée.
Il faut que tu fasses:
res = Mat::zeros(image.cols, image.rows, CV_32FC1);
(ou l'inverse, je ne sais plus dans quel est l'ordre des paramètres du constructeur de cv::Mat)
à la place de:
res.cols = image.rows; res.rows = image.cols
Il existe aussi probablement une méthode pour redimensionner une matrice, cela fait longtemps que je n'ai pas utilisé OpenCV.
Quand tu construis une matrice, le construteur alloue de la mémoire pour cols*rows éléments donc si tu déclares une matrice 1*1 puis que tu changes la valeur de rows et cols à la main, la mémoire n'a toujours pas bougée.
Il faut que tu fasses:
res = Mat::zeros(image.cols, image.rows, CV_32FC1);
(ou l'inverse, je ne sais plus dans quel est l'ordre des paramètres du constructeur de cv::Mat)
à la place de:
res.cols = image.rows; res.rows = image.cols
Il existe aussi probablement une méthode pour redimensionner une matrice, cela fait longtemps que je n'ai pas utilisé OpenCV.
Oups ! désolé j'avais pas tout lu, je croyais que tu avais corrigé après le message de Orochi :/
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. » D. Mendeleïev
transposee d'une image - openCV
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev