08: Integración de OpenCV con ROS

La integración de OpenCV con ROS (Robot Operating System) permite el desarrollo de sistemas de visión artificial avanzados para robots. ROS es un sistema operativo para robots que proporciona una estructura para el desarrollo de aplicaciones robóticas, mientras que OpenCV proporciona una gran cantidad de funciones y herramientas para el procesamiento de imágenes y vídeo.
Una de las formas más comunes de integrar OpenCV con ROS es mediante la publicación y suscripción de imágenes en los tópicos de ROS. Por ejemplo, si queremos publicar una imagen procesada por OpenCV en un tópico de ROS, podemos utilizar el siguiente código:
Subscríbete a nuestro blog
import rospy import cv2 from sensor_msgs.msg import Image from cv_bridge import CvBridge # Inicializar el nodo de ROS rospy.init_node("opencv_example") # Crear un objeto para convertir entre imágenes de OpenCV y ROS bridge = CvBridge() # Crear un objeto para publicar imágenes en el tópico "image_topic" image_pub = rospy.Publisher("image_topic", Image, queue_size=1) # Iniciar el bucle de captura de imágenes while not rospy.is_shutdown(): # Capturar una imagen desde la webcam cap = cv2.VideoCapture(0) ret, frame = cap.read() cap.release() # Procesar la imagen con OpenCV gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # Convertir la imagen a formato ROS y publicarla en el tópico ros_image = bridge.cv2_to_imgmsg(gray, "mono8") image_pub.publish(ros_image)
Por otro lado, si queremos suscribirnos a un tópico de ROS para obtener imágenes y procesarlas con OpenCV, podemos utilizar el siguiente código:
import cv2 import numpy as np # Cargar el modelo pre-entrenado de YOLO net = cv2.dnn.readNetFromDarknet("yolov3.cfg", "yolov3.weights") # Definir las capas de salida del modelo ln = net.getLayerNames() ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()] # Cargar la imagen img = cv2.imread("image.jpg") (H, W) = img.shape[:2] # Crear un blob a partir de la imagen blob = cv2.dnn.blobFromImage(img, 1 / 255.0, (416, 16), swapRB=True, crop=False) # Enviar el blob a la red neuronal net.setInput(blob) layerOutputs = net.forward(ln) # Inicializar las listas para almacenar las detecciones y las probabilidades boxes = [] confidences = [] # Recorrer las salidas de la capa for output in layerOutputs: # Recorrer las detecciones for detection in output: # Extraer las probabilidades y las coordenadas de las cajas delimitadoras scores = detection[5:] import rospy import cv2 from sensor_msgs.msg import Image from cv_bridge import CvBridge # Inicializar el nodo de ROS rospy.init_node("opencv_example") # Crear un objeto para convertir entre imágenes de OpenCV y ROS bridge = CvBridge() # Función de callback para el tópico "image_topic" def image_callback(data): # Convertir la imagen a formato OpenCV cv_image = bridge.imgmsg_to_cv2(data, "bgr8") # Procesar la imagen con OpenCV gray = cv2.cvtColor(cv_image,cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) edges = cv2.Canny(blurred, 50, 150) # Mostrar la imagen procesada con OpenCV cv2.imshow("Imagen Procesada", edges) cv2.waitKey(1) #Crear objeto para subscribirse al topico /image_topic image_sub = rospy.Subscriber("image_topic", Image, image_callback) #Mantener el bucle ROS ejecutandose rospy.spin()
En este ejemplo, se suscribe a un tópico de ROS llamado «image_topic» y se utiliza una función de callback para procesar las imágenes recibidas con OpenCV. El procesamiento en este caso es la conversión a escala de grises y un filtro de suavizado gaussiano y bordes con Canny. Finalmente se muestra la imagen procesada mediante cv2.imshow.
En resumen, la integración de OpenCV con ROS permite el desarrollo de sistemas de visión artificial avanzados para robots. Publicar y suscribir imágenes en tópicos de ROS es una forma común de integrar OpenCV con ROS. Es importante tener un conocimiento previo de la programación en Python y ROS para poder realizar la integración correctamente.