Se genera una nube de puntos utilizando una función aleatoria uniforme para (x,y,z)
. Como se muestra en la siguiente figura, se está investigando un plano de intersección plano ( perfil ) que coincide como el mejor (incluso si no es el exacto) un perfil objetivo, es decir, dado en la esquina inferior izquierda. Entonces la pregunta es:
1- ¿Cómo encontrar una coincidencia de este tipo a
target 2D point map
través depoint cloud
las siguientes notas / condiciones?
2- ¿Cuáles son entonces las coordenadas / orientaciones / grado de similitud, etc.?
Nota 1: El perfil de interés podría estar en cualquier lugar con cualquier rotación a lo largo de los ejes y también podría tener una forma diferente, por ejemplo, un triángulo, un rectángulo, un cuadrángulo, etc., dependiendo de su ubicación y orientación. En la siguiente demostración solo se muestra un rectángulo simple.
Nota 2: Un valor de tolerancia podría considerarse como la distancia de los puntos desde el perfil. Para demostrar esto para la siguiente figura suponga una tolerancia de 0.01
veces la dimensión más pequeña (~1)
de modo tol=0.01
. Entonces, si eliminamos el resto y proyectamos todos los puntos restantes en el plano del perfil que se está investigando, podremos verificar su similitud con el perfil objetivo.
Nota 3: Se puede encontrar un tema relacionado en Reconocimiento de patrones de puntos .
fuente
Python
+MatPlotLib
hacer mis investigaciones y para generar los gráficos etcP:{x,y,z}
. De hecho, son puntos adimensionales. Con alguna aproximación, sin embargo, podrían discretizarse a una dimensión de un píxel como matrices 3D. Pueden incorporar también otros atributos (como pesos, etc.) sobre las coordenadas.Respuestas:
Esto siempre requerirá muchos cálculos, especialmente si desea procesar hasta 2000 puntos. Estoy seguro de que ya existen soluciones altamente optimizadas para este tipo de coincidencia de patrones, pero debe descubrir cómo se llama para encontrarlas.
Como estás hablando de una nube de puntos (datos dispersos) en lugar de una imagen, mi método de correlación cruzada realmente no se aplica (y sería aún peor computacionalmente). Algo como RANSAC probablemente encuentre una coincidencia rápidamente, pero no sé mucho al respecto.
Mi intento de una solución:
Suposiciones
Por lo tanto, debería poder tomar muchos atajos descalificando cosas y disminuyendo el tiempo de cálculo. En breve:
Más detallado:
Cualquiera que sea la configuración que tenga el menor error al cuadrado para todos los demás puntos es la mejor coincidencia
Como estamos trabajando con 3 puntos de prueba vecinos más cercanos, los puntos objetivo coincidentes se pueden simplificar comprobando si están dentro de cierto radio. Si busca un radio de 1 desde (0, 0), por ejemplo, podemos descalificar (2, 0) basado en x1 - x2, sin calcular la distancia euclidiana real, para acelerarlo un poco. Esto supone que la resta es más rápida que la multiplicación. También hay búsquedas optimizadas basadas en un radio fijo más arbitrario .
El tiempo mínimo de cálculo sería si no se encuentran coincidencias de 2 puntos.( 20002)
En realidad, dado que necesitará calcular todo esto de todos modos, ya sea que encuentre coincidencias o no, y dado que solo se preocupa por los vecinos más cercanos para este paso, si tiene la memoria, probablemente sea mejor calcular previamente estos valores utilizando un algoritmo optimizado . Algo así como una triangulación de Delaunay o Pitteway , donde cada punto del objetivo está conectado a sus vecinos más cercanos. Guárdelos en una tabla, luego búsquelos para cada punto cuando intente ajustar el triángulo de origen a uno de los triángulos de destino.
Hay muchos cálculos involucrados, pero debería ser relativamente rápido ya que solo está operando en los datos, lo cual es escaso, en lugar de multiplicar muchos ceros sin sentido, como implicaría la correlación cruzada de datos volumétricos. Esta misma idea funcionaría para el caso 2D si encontrara primero los centros de los puntos y los almacenara como un conjunto de coordenadas.
fuente
Fortran
números superiores a los500
puntos, será imposible tener experiencias con la PC.Agregaría la descripción de @ mirror2image en la solución alternativa al lado de RANSAC, puede considerar el algoritmo ICP (punto iterativo más cercano), ¡ aquí puede encontrar una descripción !
Creo que el próximo desafío al usar este ICP es definir su propia función de costo y la pose inicial del plano objetivo con respecto a los datos del punto de nube 3D. Un enfoque práctico es introducir algo de ruido aleatorio en los datos durante la iteración para evitar la convergencia a los mínimos falsos. Esta es la parte heurística que supongo que necesitas diseñar.
Actualizar:
Los pasos en forma simplificada son:
Itera el paso 1-4.
¡Hay una biblioteca disponible que puede considerar aquí ! (Todavía no lo he probado), hay una sección en la parte de registro (que incluye otros métodos).
fuente