Je fais des travaux de détection à l'aide de OPENCV et je dois utiliser la distance de la distance. Sauf la fonction de transformation de distance dans OpenCV me donne une image exactement la même que l'image que j'utilise comme source. Quelqu'un sache ce que je fais mal? Voici la partie de mon code: en un mot, j'ai gradi l'image du kinect, transformez-la en une image d'une chaîne, lisser-la, exécutez le détecteur de bord canny, inverser la Les valeurs, puis je fais la distance de la distance. Mais l'image transformée ressemble exactement à la même chose que l'image d'entrée. Qu'est-ce qui ne va pas? P> Merci! P> P>
4 Réponses :
Je crois que la clé ici est qu'ils lookont em> la même chose. Voici un petit programme que j'ai écrit pour montrer la différence: dans l'image non normalisée, vous voyez ceci: qui n'a pas vraiment l'air de changer quelque chose, mais le Les étapes de distance sont très petites par rapport à la plage globale de valeurs [0, 255] (en raison de Nous obtenons maintenant ceci: Les valeurs elles-mêmes doivent être correctes, mais quand vous aurez besoin de Pour normaliser l'image pour voir la différence. p> EDIT: strong>
Voici un petit échantillon 10x10 à partir du coin supérieur gauche de la matrice code> Matrix indique que les valeurs sont en fait différents: p>
p> imshow code> convertissant l'image du flotteur 32 bits en 8 bits pour l'affichage), nous ne pouvons pas voir le Différences, alors normalisons-le ... P>
p>
Désolé mais j'ai essayé de le faire depuis un moment et je ne peux pas sembler comprendre. Comment prenez-vous l'exemple que vous venez de faire ci-dessus? Je continue d'essayer d'imprimer des valeurs en pixels à l'écran avec Printf, mais je viens de prendre des ordures. Comment imprimer ipl_depth_8u à l'écran et ipl_depth_32f à l'écran? Merci
@Minaalmasry réellement cette question est digne d'un nouveau poste de débordement de pile; Je ne vois pas que cela a demandé, de sorte que d'autres à l'avenir voudront peut-être savoir comment le faire aussi!. Je suis sûr que moi-même ou un autre enthousiaste d'OpenCV vous aidera volontiers à y répondre.
Vous pouvez imprimer ces valeurs à l'aide de ce code avant la normalisation de la fonction:
for(int x=0; x<10;x++)
{
cout<<endl;
for(int y=0; y<10;y++)
cout<<std::setw(10)<<dist.at<float>(x, y);
}
Je viens de comprendre celui-ci.
L'OpenCV distancétransform code>
calcule la distance au zéro pixel le plus proche pour chaque pixel de l'image source. p> blockQuote>
et il s'attend donc à ce que vos bords Image soit négatif. P>
Tout ce que vous avez à faire est de nier vos bords Image: P>
edges = 255 - edges;
Pourquoi utiliser bords = 255 - bords; code> au lieu de simplement pas code> ( bitwise_not code>)?
Si vous souhaitez visualiser le résultat, vous devez accumuler la normalisation à 0 ... 255 et non à 0 ... 1 ou tout semblera noir. Utilisation de normalisé (MAT_DIST, MAT_NORM, 0, 255, NORM_MINMAX, CV_8U); CODE> P>
Imshow (); code> sur une image à 0 ... 1 L'image fonctionnera mais peut provoquer des problèmes lors des prochaines étapes de traitement. Tout cela a fait dans mon cas. P>
Je ne pense pas que ce soit une bonne idée d'utiliser un filtre médian avant la détection des bords: le filtre gaussien serait bien meilleur car il n'introduit aucun artefacts, etc.