Traitement d'images
Un scanner 3D au-dessus d'un convoyeur fournit un nuage de points : plusieurs milliers de points dans l'espace, désordonnés, bruités et lacunaires. Les questions sous-jacentes sont simples : qu'y a-t-il là ? Est-ce un cylindre, un parallélépipède, une sphère ? Quelle est sa taille, et quel est son volume ?
La chaîne de traitement
- Filtrer : recadrer la zone, éclaircir avec une grille de voxels, supprimer les points aberrants – dans la Point Cloud Library (PCL) avec
CropBox,VoxelGridetStatisticalOutlierRemoval. - Supprimer le support : trouver le convoyeur ou le sol sous forme de plan et le retirer.
- Segmenter : répartir les points restants en objets distincts selon leur proximité, par exemple avec
EuclideanClusterExtraction. - Reconnaître la forme : ajuster des modèles comme un plan, un cylindre ou une sphère et retenir celui qui recueille le plus de points correspondants.
- Mesurer : déterminer les dimensions, la boîte englobante et le volume.
RANSAC : robuste face aux points aberrants
RANSAC (Random Sample Consensus) est la bête de somme de l'analyse de nuages de points. Il choisit encore et encore au hasard le plus petit échantillon possible – trois points pour un plan –, en calcule le modèle et compte les points situés dans la bande de tolérance. Le modèle qui recueille le plus de correspondances l'emporte ; les points aberrants ne trouvent jamais assez de soutiens.
Le nombre d'itérations nécessaire est N = log(1 − p) / log(1 − ws), avec la probabilité de succès p, la proportion de points correspondants w et la taille d'échantillon s. Si 30 % des points se trouvent sur le convoyeur, environ 170 itérations suffisent pour une certitude de 99 %.
La plus petite boîte englobante
Pour l'emballage, l'espace de stockage ou le tri, c'est souvent la plus petite boîte autour d'un objet qui compte. La boîte alignée sur les axes dépend de la position de l'objet, et la boîte orientée selon les axes principaux (ACP) n'est qu'une approximation. Pour les objets posés sur un convoyeur, il existe un raccourci élégant, car la boîte repose sur le plan du convoyeur. On projette les points de l'objet dans ce plan et on cherche le plus petit rectangle autour de l'emprise. Selon Freeman et Shapira, un côté de ce rectangle se trouve toujours sur une arête de l'enveloppe convexe. Il suffit donc de tester un rectangle par arête de l'enveloppe – c'est ce que font les rotating calipers (pieds à coulisse tournants). En Python, cv2.minAreaRect se charge de cette recherche :
import numpy as np
import cv2
def ebene_ransac(punkte, schwelle=2.0, durchlaeufe=200):
"""Plan dont le plus grand nombre de points sont plus proches que 'schwelle' (mm)."""
rng = np.random.default_rng(1)
beste, beste_anzahl = None, 0
for _ in range(durchlaeufe):
p1, p2, p3 = punkte[rng.choice(len(punkte), 3, replace=False)]
n = np.cross(p2 - p1, p3 - p1)
if np.linalg.norm(n) < 1e-9: # trois points alignés
continue
n /= np.linalg.norm(n)
anzahl = np.count_nonzero(np.abs((punkte - p1) @ n) < schwelle)
if anzahl > beste_anzahl:
beste, beste_anzahl = (n, -n @ p1), anzahl
return beste
def vermesse_objekt(punkte, schwelle=2.0):
n, d = ebene_ransac(punkte, schwelle)
abstand = punkte @ n + d
if np.median(abstand) < 0: # la normale doit pointer à l'opposé du convoyeur
n, abstand = -n, -abstand
oben = abstand > 3 * schwelle
# Définir deux axes dans le plan, y projeter les points de l'objet
u = np.cross(n, [1.0, 0, 0] if abs(n[0]) < 0.9 else [0, 1.0, 0])
u /= np.linalg.norm(u)
grundriss = np.column_stack((punkte[oben] @ u, punkte[oben] @ np.cross(n, u)))
_, (a, b), _ = cv2.minAreaRect(grundriss.astype(np.float32))
return max(a, b), min(a, b), np.percentile(abstand[oben], 99)
Pour un parallélépipède simulé de 120 × 80 × 50 mm sur un convoyeur incliné avec 0,5 mm de bruit, le code fournit 120,5 × 80,4 × 50,9 mm. Le 99e centile pour la hauteur atténue les points aberrants isolés.
Volume : boîte, enveloppe ou carte des hauteurs
Le volume de la boîte n'est qu'une limite supérieure : un cylindre remplit sa boîte à un peu plus des trois quarts, une sphère à un peu plus de la moitié. L'enveloppe convexe est plus précise, mais reste trop grande pour les objets concaves. Comme un scanner placé au-dessus ne voit que la face supérieure, on calcule souvent le volume sous forme de carte des hauteurs : pour chaque cellule de l'emprise, la surface multipliée par la hauteur au-dessus du convoyeur.
Retour d'expérience
Pour un fabricant international de capteurs, nous avons développé un logiciel qui reconnaît des objets dans les nuages de points de ses scanners 3D, classe leur forme – cylindre, parallélépipède, sphère – puis calcule rapidement leur volume. Nous avons notamment utilisé RANSAC, la boîte englobante minimale, les rotating calipers et des calculs de valeurs propres. Nous avons d'abord précalculé et vérifié chaque algorithme dans MATLAB avant de le mettre en œuvre en C++ avec PCL, OpenCV, Halcon et Eigen. Nous avons testé en laboratoire avec des scanners placés à différentes positions, avec des données issues d'une installation de production et avec une simulation de données de scan pour laquelle nous avons modélisé le montage en 3D.
Erreurs typiques
- Calculer sans filtre. Les points aberrants et les réflexions multiples gonflent chaque boîte.
- Choisir une tolérance RANSAC inférieure au bruit de mesure – la méthode ne trouve alors pas le plan de manière fiable.
- Présenter le volume de la boîte comme le volume réel.
- Ne tester qu'avec des données de laboratoire propres. Les données de l'installation et les cas limites simulés en font partie.
Comment nous vous aidons
- Étude de faisabilité : sur vos données de scan, nous vérifions si la reconnaissance et la mesure atteignent la précision exigée – sous forme d'étude de faisabilité en traitement d'images à prix fixe.
- Algorithmes et logiciels : de la vérification dans MATLAB à la mise en œuvre en C++ ou C# sur PC et système embarqué : le traitement d'images chez Cadida.
- Votre projet : Demander un projet ou convenir d'un premier entretien
Tiré de nos projets : reconnaissance d'objets dans des nuages de points et étalonnage de scanners 3D pour un fabricant international de capteurs. Pour aller plus loin : M. A. Fischler, R. C. Bolles, « Random Sample Consensus », Communications of the ACM 24(6), 1981 ; H. Freeman, R. Shapira, Communications of the ACM 18(7), 1975 ; Point Cloud Library.
