2011-02-01 3 views

Répondre

1

La bibliothèque Gnu Triangulated Surface?

Lorsque je l'ai fait avant que j'aie une carte de profondeur (ou carte de disparité si vous préférez) et - connaissant le calibrage original de la caméra - ai pu effectuer la re-projection en R3 pour les points. Connaissant le voisinage de chaque point (par leurs pixels voisins d'origine), il est assez trivial de créer ensuite une triangulation de base pour les relier.

(Si vous ne saviez pas ce que vous auriez à tenter une forme de triangulation de Delaunay ou un autre algorithme plus avancé ...)

Assurez-vous que vous obtenez l'ordre de sommet correct pour chaque triangle pour assurer que toutes les les normales pointent de manière correcte/cohérente.

Meshlab est très pratique pour tout post-traitement supplémentaire.

-1

une carte de disparité vous donne x, y et f (z). Vous avez besoin de l'étalonnage de la caméra pour savoir comment transformer la disparité en z.

J'ai une carte de disparité de une image

Une carte de disparité d'une image serait généralement complètement à plat ...

+0

Non, une carte de disparité est un ensemble de (x, y, disparité), avec x et y dans l'espace image, que vous pouvez transformer en un ensemble de points 3D, ce que l'OP demande comment faire. – etarion

+0

@etarion Vous avez raison, je vais changer ma réponse. – koan

1
 cvFindStereoCorrespondenceBM(frame1r, frame2r, disp, BMState); 

     /*  cvShowImage("camera1", frame1); 
       cvShowImage("camera2", frame2);   */  
     //  cvConvertScale(disp, disp, 16, 0); 
       cvNormalize(disp, vdisp, 0, 256, CV_MINMAX);     
       cvShowImage("disparity", vdisp);    
       cvReprojectImageTo3D(disp, Image3D, &_Q);    
       cvShowImage("depthmap",Image3D); 

cet extrait de code vous aiderait j'espère. Voici l'explication du code est la suivante: Lorsque je rectifie les images des caméras droite et gauche et en définissant le BMstate j'ai passé cela en cvFindStereoCorrespondenceBM pour trouver l'image de disparité. Ensuite, définissant une matrice de dimension 3 pour stocker les points 3D comme Image3D. Par la fonction dans OpenCV cvReprojectImageTo3D passant la matrice Q que nous obtenons en correspondance stéréo, on obtient l'ensemble des points 3D correspondant à cette image 2D

+0

Votre réponse serait plus utile si elle explique _why_ c'est une chose utile à faire; les extraits de code virtuellement purs ont tendance à ne pas avoir beaucoup de upvotes. –

+1

Donald Fellows, Édité l'explication – nbsrujan

-1
@ here is calculation which may help you 

    % %Z = fB/d 
    % where 
    % Z = distance along the camera Z axis 
    % f = focal length (in pixels) 
    % B = baseline (in metres) 
    % d = disparity (in pixels) 
    % % After Z is determined, X and Y can be calculated using the usual projective   camera equations: 
% 
    % X = uZ/f 
    % Y = vZ/f 

% where 
% u and v are the pixel location in the 2D image 
% X, Y, Z is the real 3d position 

    % Note: u and v are not the same as row and column. You must account for the image center. You can get the image center using the triclopsGetImageCenter() function. Then you find u and v by: 

    % u = col - centerCol 
    % v = row - centerRow 

    % Note: If u, v, f, and d are all in pixels and X,Y,Z are all in the meters, the units will always work i.e. pixel/pixel = no-unit-ratio = m/m. 
+0

il serait préférable d'ajouter quelques explications avec le code. SO n'est pas une "bibliothèque de code", mais un site d'aide. Ajouter une explication est la meilleure façon de répondre à une question, non seulement le code est important, mais comment cela fonctionne et le principe de fonctionnement est aussi important que la solution à un problème. –