Bonjour à tous,
Je suis débutant sous Matlab et je travaille sur un projet de traitement de nuages de points 3D.
Le contexte est que je dispose d’un nuage sous forme d’une matrice de n lignes (pour n points) et 3 colonnes (coordonnées X, Y et Z). Ce nuage est ensuite projeté sous forme de deux images :
- Une image de densité qui m’indique le nombre de points projetés par pixel
- Une image d’élévation qui donne l’altitude maximale pour chaque pixel parmi les points qui y sont projetés (pas utile pour la suite)
Pour créer ces images, j’emploie donc la boucle suivante :
Mon objectif est de remplir la structure (créée sous forme de matrice et de mêmes dimensions que l’image) et d’avoir dans chaque cellule, les points du nuage projetés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 maxX = max(nuage(:,1)); maxY = max(nuage(:,2)); maxZ = max(nuage(:,3)); minX = min(nuage(:,1)); minY = min(nuage(:,2)); minZ = min(nuage(:,3)); bornes = [minX,minY,minZ; maxX, maxY, maxZ]; %definit les limites du nuage pas=0.05; %dimension du pixel pour les images dimX = ceil((bornes (2,1) - bornes(1,1))/pas); %definit les dimensions de l'image en function du pas dimY = ceil((bornes (2,2) - bornes(1,2))/pas); matPCd = zeros(dimX,dimY); %creation de la matrice vide à la taille de l'image matPCzmax = zeros(dimX,dimY); pointMin = bornes(1,:); %definition du point minimum en fonction des bornes for i=1:dimX if size(nuage,1) >= 1 % extraction des points selon la coord. X pC_X = find (nuage(:,1) >= pointMin(1)+(i-1)*pas & nuage(:,1) < pointMin(1)+i*pas); if size(pC_X,1) >= 1 for j=1:dimY % extraction des points selon la coord. Y pC_XY= find (nuage(pC_X,2) >= pointMin(2)+(j-1)*pas & nuage(pC_X,2) < pointMin(2)+j*pas); pC_ajout = pC_X(pC_XY); if isempty(pC_ajout)==0 matPCd(i,j) = size(pC_ajout,1); % image de densite des points matPCzmax(i,j) = max(nuage(pC_X(pC_XY),3)); % image d'altitude max des points strucPoints(dimX,dimY)=struct(); end end end end end
Exemple : pour le pixel à la position (2,3), l’image de densité indique 3 points. Dans ma structure, je souhaiterais alors pour la cellule localisée en (2,3), 3 champs ayant pour valeur [ X Y Z ] issus de "nuage(pC_X(pC_XY))" comme le montre le schema:
J’ai donc créé une structure de dimensions similaires à celles de l’image, mais je ne vois pas comment lier la valeur de chaque pixel de l’image de densité aux nombre de champs pour la structure. De même, pour récupérer les valeurs de "nuage(pC_X(pC_XY))" à chaque cycle pour les attribuer en valeurs aux champs définis précédemment.
Auriez-vous des pistes pour me guider ? Je cale complètement sur ces deux derniers points et cela me paraît difficilement automatisable…
Merci par avance !
Partager