2015-04-18 4 views
1

J'essaye de reconstruire la forme d'une voile. J'utilise la méthode de reconstruction 3D clairsemée. J'utilise deux caméras avec lesquelles j'ai pris deux photos. J'ai réussi à faire l'étalonnage de ces caméras aussi. Dans les images, il est possible de voir le damier et le code que j'ai écrit le détecte correctement. Maintenant, comme mes images sont en noir et blanc et que la qualité des caméras est assez faible, je ne peux pas utiliser correctement la méthode detectFeatures. Des problèmes surviennent lorsque j'essaie d'utiliser matchFeatures. Pour surmonter ce problème, j'ai décidé d'utiliser à la place une commande cpselect. Ce faisant, je peux cliquer manuellement sur les fonctionnalités. La correspondance entre les points des deux vues semble maintenant être correcte. Quand je continue avec le code et essaye de reconstruire le complot 3D je reçois des points partout. Cela semble déformé. L'intrigue ne représente clairement pas la voile et je ne sais pas pourquoi.Problèmes de reconstruction 3D MATLAB clairsemés. D'une manière ou d'une autre je ne peux pas obtenir le diagramme de dispersion final des points à travailler

Le code suit.

Nous vous remercions à l'avance

% % Load precomputed camera parameters 
load IP_CalibrationCarlos.mat        %Calibration  feature 
% 
I1 = imread('/Users/riccardocamin/Documents/MATLAB/Frames/Scan1.1.jpg'); 
I2 = imread('/Users/riccardocamin/Documents/MATLAB/Frames/Scan2.1.jpg'); 
% 
[I1, newOrigin1] = undistortImage(I1, cameraParameters, 'OutputView', 'full'); 
[I2, newOrigin2] = undistortImage(I2, cameraParameters, 'OutputView', 'full'); 
% 
I1 = imcrop(I1, [80 10 1040 1300]);      %Necessary so images have same size 
I2 = imcrop(I2, [0 10 1067 1300]); 
% 
squareSize = 82;          % checkerboard square  size in millimeters 
% 
[imagePoints, boardSize, pairsUsed] = detectCheckerboardPoints(rgb2gray(I1), rgb2gray(I2)); 
[refPoints1, boardSize] = detectCheckerboardPoints(rgb2gray(I1)); 
[refPoints2, boardSize] = detectCheckerboardPoints(rgb2gray(I2)); 
% 
% % Translate detected points back into the original image coordinates 
refPoints1 = bsxfun(@plus, refPoints1, newOrigin1); 
refPoints2 = bsxfun(@plus, refPoints2, newOrigin2); 
% 
worldPoints = generateCheckerboardPoints(boardSize, squareSize); 
% 
[R1, t1] = extrinsics(refPoints1, worldPoints, cameraParameters); %R = r t = translation 
[R2, t2] = extrinsics(refPoints2, worldPoints, cameraParameters); 
% 
% % Calculate camera matrices using the |cameraMatrix| function. 
cameraMatrix1 = cameraMatrix(cameraParameters, R1, t1); 
cameraMatrix2 = cameraMatrix(cameraParameters, R2, t2); 
% 
cpselect(I1, I2); % Save them as 'matchedPoints1'and 'matchedPoints2' 
% 
indexPairs = matchFeatures(matchedPoints1, matchedPoints2); 
% Visualize correspondences 
figure; 
showMatchedFeatures(I1, I2, matchedPoints1, matchedPoints2); 
title('Matched Features'); 
% 
[points3D] = triangulate(matchedPoints1, matchedPoints2, ... 
cameraMatrix1, cameraMatrix2); 
% 
x = -points3D(:,1); 
y = -points3D(:,2); 
z = -points3D(:,3); 
figure 
scatter3(x,y,z, 25); 
xlabel('X'); 
ylabel('Y'); 
zlabel('Z'); 
+1

Pouvez-vous fournir un exemple de sortie que vous avez mentionné dans la question? –

+0

S'il vous plaît jeter un oeil à ce lien, il y a des images et les fichiers que j'ai utilisés. [lien] (http://fr.mathworks.com/matlabcentral/answers/210084-3d-sparse-reconstruction-issues-somehow-i-can-t-get-the-final-scatter-plot-of- les-points-au-travail) –

Répondre

0

Le premier problème que vous avez est que vous recadrez les images. Une fois que vous faites cela, toutes vos coordonnées sont désactivées. Vous n'avez pas besoin de faire cela ici, car les images n'ont pas besoin d'être de la même taille.

La deuxième question est de savoir avec quelle précision avez-vous sélectionné les points correspondants? De la photo que vous avez affichée, il semble que vos correspondances peuvent être décalées de quelques pixels, ce qui peut entraîner une erreur de reconstruction importante. Pouvez-vous essayer de trouver les centroïdes des taches sur la voile en utilisant regionprops?

De plus, les deux caméras sont-elles fixes l'une par rapport à l'autre? Si c'est le cas, alors vous feriez mieux de calibrer la paire stéréo, et faire la reconstruction dense comme dans ce example. Dans ce cas, les deux images doivent être de la même taille.