J'utilise vl_dsift
dans MATLAB pour calculer des entités SIFT denses dans une paire d'images stéréo. Les correspondances de caractéristiques semblent plus ou moins correctes, mais quand je triangule mon nuage 3D est plat, tous les points ont la même profondeur, ce qui n'est pas vrai pour ma scène et ne se produit pas non plus quand j'utilise vl_sift
. Mon code est le suivant:Reconstruction de scène après SIFT dense
[fL, dL] = vl_dsift(frameLeftGray,'step',10,'size',20,'fast') ;
[fR, dR] = vl_dsift(frameRightGray,'step',10,'size',20,'fast') ;
[matches, scores] = vl_ubcmatch(dL, dR, 1.5) ;
matchedPoints1 = fL(1:2,matches(1,:))';
matchedPoints2 = fR(1:2,matches(2,:))';
points3D = triangulate(matchedPoints1, matchedPoints2,stereoParams);
points3D = points3D ./ 1000;
numPixels = size(frameLeftRect, 1) * size(frameLeftRect, 2);
allColors = reshape(frameLeftRect, [numPixels, 3]);
colorIdx = sub2ind([size(frameLeftRect, 1), size(frameLeftRect, 2)],round(matchedPoints1(:,2)), round(matchedPoints1(:, 1)));
color = allColors(colorIdx, :);
ptCloud1 = pointCloud(points3D, 'Color', color);
player3D = pcplayer([-0.02, 0.02], [-0.05, 0.05], [0.02, 0.12], 'VerticalAxis', 'y', 'VerticalAxisDir', 'up');
view(player3D, ptCloud1);
Toute idée de ce qui pourrait aller mal?
Si je vl_sift à la place et garde tout le monde la même
[fL, dL] = vl_sift(frameLeftGray,'levels',10) ;
[fR, dR] = vl_sift(frameRightGray,'levels',10) ;
puis, je reçois la scène suivante, dont la forme que je sais est plus précis:
Il semble que pour les points 3D, la fonction 'triangulation' nécessite 2 ou 4 arguments. Ici vous passez 3 arguments, donc une triangulation 2D est effectuée. https://www.mathworks.com/help/matlab/ref/triangulation-class.html – Eskapp
@Eskapp J'utilise 'triangulate', pas' triangulation' – Controller
ooops, mon mauvais je lis votre question trop vite! Quand vous dites que cela fonctionne en utilisant 'vl_sift', est-ce la seule modification que vous apportez à votre code? Il serait utile de voir les deux codes et la sortie. – Eskapp