Saltar al contenido
Visión Artificial con OpenCv

Visión estereoscópica y profundidad

Introducción

La visión estereoscópica es la habilidad de nuestros ojos para percibir el mundo en tres dimensiones. Esta capacidad se debe a la diferencia en la posición de nuestros ojos, lo que permite que cada ojo vea una imagen ligeramente diferente. Nuestro cerebro combina estas dos imágenes para generar una imagen en 3D que nos permite percibir la profundidad y la distancia de los objetos.

En la Visión Artificial, la visión estereoscópica se utiliza para obtener información sobre la profundidad de los objetos y la distancia entre ellos. Para esto se utilizan dos cámaras que se colocan en posiciones ligeramente diferentes, y se pueden implementar algoritmos para procesar la información y obtener una imagen en 3D. Este proceso se llama "reconstrucción estereoscópica".

La profundidad es una información importante en muchas aplicaciones de Visión Artificial, como la detección de obstáculos en vehículos autónomos o la visualización en 3D de objetos en videojuegos y películas.

Resumen

La visión estereoscópica es la combinación de las imágenes vistas por ambos ojos para producir una única imagen tridimensional (3D) en el cerebro. Gracias a esta capacidad, podemos percibir la profundidad y apreciar la distancia relativa entre objetos en el espacio. En resumen, la visión estereoscópica utiliza la disparidad de la imagen entre los ojos para producir una imagen tridimensional. Cada ojo ve una ligeramente diferente perspectiva de la misma escena, y la diferencia entre estas perspectivas se utiliza para producir una imagen tridimensional.

Por otro lado, la profundidad se refiere a la distancia entre un objeto y el observador. En la visión estereoscópica, la profundidad puede ser percibida por medio de la disparidad de imagen entre los ojos. Cuando los objetos están más cerca, las imágenes que se ven con cada ojo son más dispares, mientras que cuando están más lejos, las imágenes son más similares.

En la visión artificial, la visión estereoscópica se utiliza para recrear esta capacidad biológica y generar imágenes tridimensionales a partir de dos imágenes bidimensionales. Además, la información de profundidad es útil en aplicaciones como la detección de objetos y la percepción de la distancia en entornos autónomos, como los vehículos sin conductor.

Aplicación teórica

La visión estereoscópica es el proceso en el que nuestros ojos ven una misma escena desde dos ángulos distintos y nuestro cerebro combina las dos imágenes para producir la sensación de profundidad. En la visión artificial, se puede replicar este proceso utilizando dos cámaras y OpenCV para crear un efecto estereoscópico y calcular la profundidad.

Por ejemplo, puedes utilizar dos cámaras para capturar imágenes de una misma escena desde dos ángulos ligeramente distintos. Luego, aplicando la librería de OpenCV, puedes calibrar ambas cámaras, lo que implica determinar la relación entre los píxeles en las dos imágenes. Luego, puedes realizar la triangulación de los puntos de la imagen para calcular la profundidad basándote en las diferencias entre los dos ángulos de captura.

Este enfoque se puede aplicar, por ejemplo, en sistemas de detección de objetos en automóviles que requieren una mayor comprensión de la profundidad para evitar choques. También se puede utilizar en la robótica y en la realidad virtual para crear experiencias altamente inmersivas.

Aplicación práctica

La visión estereoscópica en OpenCV

La visión estereoscópica se basa en el principio de la disparidad binocular, es decir, la diferencia en la posición de un objeto visto desde dos ojos. En OpenCV, se pueden utilizar dos cámaras para capturar imágenes y procesarlas para obtener información de profundidad. Aquí te presento un ejemplo práctico en Python de cómo usar OpenCV para realizar una visión estereoscópica y calcular la profundidad:


import cv2

# Configurar las dos cámaras
cap1 = cv2.VideoCapture(0)
cap2 = cv2.VideoCapture(1)

while True:
    # Capturar una imagen de cada cámara
    ret1, frame1 = cap1.read()
    ret2, frame2 = cap2.read()

    # Calcular la disparidad entre las dos imágenes
    stereo = cv2.StereoBM_create(numDisparities=32, blockSize=15)
    gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    disparity = stereo.compute(gray1, gray2)

    # Convertir la disparidad en una imagen de profundidad
    depth = cv2.convertScaleAbs(disparity, alpha=0.03)

    # Mostrar las imágenes
    cv2.imshow('Camera 1', frame1)
    cv2.imshow('Camera 2', frame2)
    cv2.imshow('Depth', depth)

    # Salir si se presiona 'q'
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Liberar las cámaras y cerrar todas las ventanas
cap1.release()
cap2.release()
cv2.destroyAllWindows()

Este código usa dos cámaras, una conectada al puerto 0 y la otra al puerto 1. Luego, captura una imagen de cada cámara y calcula la disparidad entre ellas utilizando el algoritmo StereoBM_create. Después, convierte la disparidad en una imagen de profundidad y muestra todas las imágenes en una ventana de OpenCV. Puede salir del programa presionando 'q'.