2 votes

Obtenir un nuage de points plat à partir de la carte de disparité

J'ai essayé de générer un nuage de points à partir d'une paire d'images stéréo rectifiées. J'ai d'abord obtenu la carte de disparité en utilisant l'implémentation sgbm d'opencv. Ensuite, je l'ai convertie en un nuage de points en utilisant le code suivant,

[for (int u=0; u < left.rows; ++u)
                {
                        for (int v=0; v < left.cols; ++v)
                        {
                                if(disp.at(u,v)==0)continue;
                                pcl::PointXYZRGB p;
                                p.x = v;
                                p.y = u;
                                p.z = (left_focalLength * baseLine * 0.01/ disp.at(u,v));
                                std::cout << p.z << std::endl;
                                cv::Vec3b bgr(left.at(u,v));
                                p.b = bgr\[0\];
                                p.g = bgr\[1\];
                                p.r = bgr\[2\];
                                pc.push_back(p);
                        }
                }][1]

left est l'image de gauche, disp est l'image de disparité de sortie en cv_16s. Ma conversion de disparité en pcl est-elle correcte ou y a-t-il un problème avec les valeurs de disparité?

J'ai inclus une capture d'écran de la carte de disparité, du nuage de points et de l'image originale de gauche.

Merci!

capture d'écran

0voto

marcoresk Points 798

Je ne suis pas confiant avec ce langage, mais j'ai remarqué une chose:
En supposant que cette ligne convertit la disparité en profondeur (Z)

p.z = (left_focalLength * baseLine * 0.01/ disp.at(u,v));

Qu'est-ce que 0.01? Si ce calcul vous donne une gamme de profondeurs (Z) de 1 à 10, ce facteur réduit votre plage de 0.01 à 0.1. La profondeur est toujours proche de zéro et vous avez une image plate (image plate = profondeur constante).

PS Je ne vois pas dans votre code la conversion X,Y à partir des valeurs de pixel u,v avec la valeur Z. Quelque chose comme

X = u*Z/f

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