2017-06-11 5 views
1

J'essaie de simuler l'effet de distorsion de l'objectif pour mon projet SLAM. Un nuage de points 3D couleur scanné est déjà donné et chargé dans OpenGL. Ce que j'essaie de faire est de rendre une scène 2D à une pose donnée et de faire une odométrie visuelle entre l'image réelle d'une caméra fisheye et l'image rendue. Comme la caméra présente une distorsion importante de l'objectif, elle doit également être prise en compte lors du rendu.Distorsion de l'objectif de l'appareil photo dans OpenGL

Le problème est que je ne sais pas où mettre la distorsion de l'objectif. Shaders?

J'ai trouvé some open codes qui mettait la distorsion dans le shader de géométrie. Mais celui-ci, je suppose que le modèle de distorsion est différent du modèle de distorsion de l'objectif dans la communauté Computer Vision. Dans la communauté CV, la distorsion de l'objectif se produit généralement sur le plan projeté.

This one est assez similaire à mon travail, mais ils n'ont pas utilisé le modèle de distorsion.

Quelqu'un a-t-il une bonne idée?

Je viens de trouver another implementation. Leur code implémentait la distorsion à la fois dans le fragment shader et dans le shader de géométrie. Mais la version fragment shader peut être appliquée dans ma situation. Ainsi, je suppose que ce qui suit fonctionnera:

# vertex shader 
p'=T.model x T.view x p 
p_f = FisheyeProjection(p') // custom fish eye projection 
+0

Une autre façon de procéder est souvent de rendre à une texture que vous mappez ensuite sur un rectangle, que vous déformez ensuite la forme de – p10ben

Répondre

2

La distorsion de l'objectif transforme généralement les lignes droites en courbes. Lorsque vous rastérisez des lignes et des triangles en utilisant OpenGL, les arêtes des primitives restent cependant droites, peu importe comment vous transformez les sommets.

Si vos modèles ont suffisamment de tesselation, l'incorporation de la distorsion dans la transformation vertex est possible. Cela fonctionne également si vous ne restituez que des points. Cependant, lorsque votre objectif est l'applicabilité générale, vous devez en quelque sorte faire face aux primitives à bords droits. Une façon consiste à utiliser un shader de géométrie pour subdiviser davantage les modèles entrants; ou vous pouvez utiliser un shader de tesselation.

Une autre méthode est de rendre dans un cubemap, puis d'utiliser un shader pour créer une lentille équivalente pour cela. Je recommande en fait cela pour générer des images fisheye.

La distorsion elle-même est généralement représentée par un polynôme d'ordre 3 à 5, mappant la distance angulaire non déformée de l'axe central optique à la distance angulaire déformée.

+0

Hi! Merci pour les idées. J'utilise une représentation de carte surfelée où chaque point a un disque avec un rayon fixe d'environ 1cm ou moins, ce qui est assez petit. Donc, je suppose que votre première solution sans les subdiviser fonctionnera pour moi. La deuxième idée semble aussi bien. Je vais vérifier le cubemap. Merci! –