Este repositorio tiene como objetivo crear una base de datos de imágenes extraídas de nubes de puntos 3D en formato .ply. El código está diseñado para trabajar específicamente con nubes generadas por el escáner 3D POP2, aunque la metodología empleada debería ser aplicable a cualquier nube de puntos 3D.
El flujo del código se centra en leer y procesar nubes de puntos, recortar un porcentaje específico de la nube, extraer la información de color de cada punto y luego generar imágenes proyectadas con una matriz de píxeles que se rellena para completar los espacios vacíos. Además, se generan máscaras de las imágenes que representan áreas específicas.
Se ha incorporado un nuevo método que permite capturar imágenes desde múltiples vistas alrededor del objeto. Este enfoque se basa en capturar fotogramas del visualizador de Open3D, aplicando rotaciones en los tres ejes (pitch, yaw y roll). Para ello se han añadido dos archivos nuevos:
capture3d.py: Contiene funciones que, a partir de una nube de puntos o malla, generan múltiples imágenes al rotar el objeto. Se capturan las vistas mediante el visualizador de Open3D en modo oculto, guardando cada imagen con información de los ángulos de rotación.main2.py: Script principal que invoca las funciones decapture3d.py. Recorre las nubes de puntos en un directorio específico y genera las imágenes correspondientes en otro directorio.
-
Carga de Nube de Puntos: El código utiliza la librería Open3D para leer las nubes de puntos en formato
.ply. -
Recorte de Nube: El recorte de la nube de puntos se controla mediante el parámetro
cut_percentage. Este parámetro determina el porcentaje de la nube que se utilizará para la extracción de la imagen. El valor predeterminado es 60%, lo que significa que se utiliza el 60% de la región frontal de la nube de puntos.cut_percentage = 0: Se utiliza la nube completa, sin recorte (puede provocar solapamientos en las proyecciones).cut_percentage = 60: Usa el 60% de la parte frontal de la nube.cut_percentage = -60: Toma el 60% de la parte posterior de la nube.
-
Extracción de Información de Color: La información de color se mapea en una matriz bidimensional, cuyas dimensiones se calculan a partir de los valores mínimos y máximos de las coordenadas x y y de la nube, permitiendo escalar y ajustar la imagen al tamaño deseado.
-
Escala: La imagen resultante se escala utilizando un factor que garantiza que la nube de puntos tenga un tamaño mínimo aceptable en la imagen generada. El cálculo se realiza mediante:
x_vals = points[:,0] y_vals = points[:,1] x_min, x_max = x_vals.min() - 5, x_vals.max() + 5 y_min, y_max = y_vals.min() - 5, y_vals.max() + 5 x_range = x_max - x_min y_range = y_max - y_min if x_range == 0: x_range = 1e-6 if y_range == 0: y_range = 1e-6 # Escala para que la nube quepa y tenga tamaño mínimo aceptable min_dimension = 200 mayor_rango = max(x_range, y_range) scale_factor = 1.0 if mayor_rango < 1: scale_factor = min_dimension / mayor_rango else: scale_factor = custom_scale_factor
-
Generación de Imágenes y Máscaras: Se generan dos imágenes principales:
- Imagen proyectada: Representa la nube de puntos en 2D.
- Máscara: Resalta los puntos relevantes (por ejemplo, con color blanco).
-
Relleno de Píxeles Vacíos: Tras la proyección, se aplican métodos para rellenar los píxeles vacíos. Se ofrecen dos alternativas:
- Método 1: Relleno básico en la imagen y la máscara.
- Método 2: Relleno alternativo que preserva los bordes para obtener mejores resultados visuales.
El archivo principal main.py implementa el método tradicional de proyección de la nube de puntos. Para ejecutarlo, utiliza:
python main.pyEste script procesa una o varias nubes de puntos y genera las imágenes en el directorio de salida configurado.
El nuevo enfoque se ejecuta mediante main2.py, el cual utiliza las funciones de capture3d.py para capturar imágenes desde múltiples vistas. Para ejecutarlo, simplemente corre:
python main2.pyEste script recorre las nubes de puntos en el directorio ./data/POP2/{categoria}/pcd/ (por ejemplo, mango) y guarda las imágenes resultantes en ./data/POP2/{categoria}/color/.
El código requiere las siguientes librerías:
open3dopencv-python(cv2)glob
Instálalas ejecutando:
pip install open3d opencv-pythonFruit-Ripeness/
├── main.py # Enfoque tradicional de extracción de imágenes
├── main2.py # Nuevo enfoque para captura de múltiples vistas
├── POP2/
│ ├── extract_image_pcd.py # Función point_cloud_to_image para proyectar la nube 3D a 2D
│ ├── util.py # Funciones auxiliares (recorte, cambio de color, etc.)
│ └── capture3d.py # Funciones para capturar múltiples vistas de la nube de puntos
└── data/
└── POP2/
└── mango/
main.py: Script principal que utiliza el método tradicional para procesar nubes de puntos.main2.py: Script que implementa el nuevo método de captura de imágenes desde múltiples vistas, aprovechando las funciones decapture3d.py.POP2/extract_image_pcd.py: Contiene la funciónpoint_cloud_to_image, que convierte la nube de puntos en una imagen 2D.POP2/util.py: Incluye funciones auxiliares, comofilter_pcd_percentagepara recortar la nube ychange_image_colorpara modificar la imagen generada.POP2/capture3d.py: Implementacapture_views_for_pcdyprocess_input_folder, que permiten capturar imágenes de la nube desde múltiples ángulos aplicando rotaciones en los ejes pitch, yaw y roll.
- El parámetro
cut_percentagepermite seleccionar la región deseada de la nube: 0 para la nube completa, valores positivos para la parte frontal y negativos para la parte posterior. - Ajustar el
custom_scale_factorpuede requerir incrementar el número de iteraciones en el relleno de píxeles para obtener mejores resultados visuales. - Se recomienda una dimensión mínima de 200 para las imágenes generadas (con
custom_scale_factor== 1), aunque puedes modificar este valor según tus necesidades. - Verifica que los directorios de entrada y salida existan o que el script tenga permisos para crearlos, especialmente al utilizar el nuevo enfoque en
main2.py.