Procesamiento de imágenes
Un escáner 3D situado sobre una cinta transportadora proporciona una nube de puntos: muchos miles de puntos en el espacio, desordenados, con ruido y con huecos. Las preguntas que hay detrás son sencillas: ¿qué hay ahí? ¿Es un cilindro, un cuboide, una esfera? ¿Qué tamaño tiene y cuál es su volumen?
La cadena de procesamiento
- Filtrar: recortar la zona, reducir la densidad con una rejilla de vóxeles y eliminar valores atípicos; en la Point Cloud Library (PCL), con
CropBox,VoxelGridyStatisticalOutlierRemoval. - Eliminar el fondo: encontrar la cinta transportadora o el suelo como plano y restarlo.
- Segmentar: dividir los puntos restantes en objetos individuales según su proximidad, por ejemplo con
EuclideanClusterExtraction. - Reconocer la forma: ajustar modelos como plano, cilindro o esfera y quedarse con el que tenga más puntos coincidentes.
- Medir: determinar las dimensiones, la caja envolvente y el volumen.
RANSAC: robusto frente a valores atípicos
RANSAC (Random Sample Consensus) es el caballo de batalla del análisis de nubes de puntos. Elige una y otra vez al azar la muestra más pequeña posible (tres puntos para un plano), calcula con ella el modelo y cuenta los puntos que hay dentro de la banda de tolerancia. Gana el modelo con más coincidencias; los valores atípicos nunca encuentran suficientes apoyos.
El número de iteraciones necesario es N = log(1 − p) / log(1 − ws), con la seguridad p, la proporción de puntos coincidentes w y el tamaño de la muestra s. Si el 30 % de los puntos están sobre la cinta, para un 99 % de seguridad bastan unas 170 iteraciones.
La caja envolvente mínima
Para el embalaje, el espacio de almacén o la clasificación, a menudo lo que cuenta es la caja más pequeña alrededor de un objeto. La caja alineada con los ejes depende de cómo esté colocado el objeto, y la caja a lo largo de los ejes principales (PCA) es solo una aproximación. Para objetos sobre una cinta hay un atajo elegante, porque la caja se apoya en el plano de la cinta. Se proyectan los puntos del objeto sobre ese plano y se busca el rectángulo más pequeño alrededor de la planta. Según Freeman y Shapira, un lado de este rectángulo está siempre sobre una arista de la envolvente convexa. Basta, por tanto, con comprobar un rectángulo por cada arista de la envolvente; de ello se encargan los rotating calipers. En Python, cv2.minAreaRect realiza esta búsqueda:
import numpy as np
import cv2
def ebene_ransac(punkte, schwelle=2.0, durchlaeufe=200):
"""Plano al que la mayoría de los puntos están más cerca 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: # tres puntos en una misma línea
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 normal debe apuntar en sentido contrario a la cinta
n, abstand = -n, -abstand
oben = abstand > 3 * schwelle
# Definir dos ejes en el plano y proyectar sobre él los puntos del objeto
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)
Para un cuboide simulado de 120 × 80 × 50 mm sobre una cinta inclinada con 0,5 mm de ruido, el código da 120,5 × 80,4 × 50,9 mm. El percentil 99 para la altura atenúa los valores atípicos aislados.
Volumen: caja, envolvente o mapa de alturas
El volumen de la caja es solo un límite superior: un cilindro llena algo más de tres cuartas partes de su caja, y una esfera, algo más de la mitad. La envolvente convexa es más precisa, pero en los objetos cóncavos sigue siendo demasiado grande. Como un escáner situado arriba solo ve la cara superior, el volumen se calcula a menudo como mapa de alturas: para cada celda de la planta, superficie por altura sobre la cinta.
De la práctica
Para un fabricante internacional de sensores desarrollamos un software que reconoce objetos en las nubes de puntos de sus escáneres 3D, clasifica su forma (cilindro, cuboide, esfera) y a continuación calcula rápidamente el volumen. Se utilizaron, entre otros, RANSAC, minimal bounding box, rotating calipers y cálculos de valores propios. Cada algoritmo lo precalculamos y comprobamos primero en MATLAB, antes de implementarlo en C++ con PCL, OpenCV, Halcon y Eigen. Hicimos pruebas en el laboratorio con escáneres en distintas posiciones, con datos de una instalación de producción y con una simulación de datos de escaneado, para la que modelamos el montaje en 3D.
Errores típicos
- Calcular sin filtrar. Los valores atípicos y las reflexiones múltiples inflan cualquier caja.
- Elegir una tolerancia de RANSAC menor que el ruido de medición: entonces el método no encuentra el plano de forma fiable.
- Dar el volumen de la caja como volumen real.
- Probar solo con datos de laboratorio limpios. Los datos de la instalación y los casos límite simulados también forman parte de las pruebas.
Cómo le ayudamos
- Estudio de viabilidad: comprobamos con sus datos de escaneado si el reconocimiento y la medición se consiguen con la precisión exigida, como estudio de viabilidad de procesamiento de imágenes a precio fijo.
- Algoritmos y software: desde la comprobación en MATLAB hasta la implementación en C++ o C# en PC y sistemas embebidos: procesamiento de imágenes en Cadida.
- Su proyecto: Solicite su proyecto o concierte una primera conversación
De nuestros proyectos: reconocimiento de objetos en nubes de puntos y calibración de escáneres 3D para un fabricante internacional de sensores. Para saber más: 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.
