
Proyecto BermejaPi — Entrada 13: Cartografiando el planeta desconocido
Ya sabemos que nuestro exoplaneta tiene una masa similar a la Tierra, un escudo atmosférico protector y un 22% de firma biológica en la superficie. Sin embargo, de nada sirve detectar vegetación u océanos si no sabemos dónde están ubicados.
En esta misión, BermejaPi deja de tratar las fotos como capturas aisladas y utiliza algoritmos de visión por computador (ORB + Homografía) para unir las imágenes en ráfaga de la ISS y construir el primer mosaico cartográfico planetario.
1. La Matemática del Solapamiento (Matriz de Homografía)
Cuando la ISS orbita a $7{,}66\text{ km/s}$, cada foto comparte aproximadamente un 60% de terreno con la foto anterior. Para alinear dos imágenes tomadas desde posiciones distintas, la informática busca puntos de interés coincidentes (esquinas, costas, nubes) y calcula una Matriz de Homografía ($H$).
Esta matriz de transformación $3 \times 3$ permite proyectar los píxeles de la segunda imagen ($x’, y’$) sobre el sistema de coordenadas de la primera ($x, y$):
\begin{bmatrix} x' \ y' \ 1 \end{bmatrix} = H \cdot \begin{bmatrix} x \ y \ 1 \end{bmatrix}Donde $H$ compensa el desplazamiento, la rotación y la perspectiva orbital de la nave.
2. Código en Python: Generador y Mosaico de Imágenes
El siguiente script genera automáticamente el mapa sintetizado si no tienes imágenes previas en la carpeta, extrae los puntos de control con OpenCV y guarda el archivo mapa_planetario.jpg en el disco.
Python
import cv2
import numpy as np
from pathlib import Path
def generar_rafaga_orbital():
"""Simula una franja continua de planeta y genera 2 fotos con 60% de solapamiento."""
# Lienzo continuo (Océano + Continente + Textura)
canvas = np.full((1080, 2600, 3), (160, 90, 30), dtype=np.uint8) # Agua (BGR)
# Continente principal
cv2.rectangle(canvas, (300, 150), (2200, 920), (35, 130, 50), -1)
cv2.circle(canvas, (700, 400), 250, (20, 90, 180), -1) # Mar interior
# Textura y nubes (esenciales para que el algoritmo encuentre puntos clave)
cv2.circle(canvas, (800, 300), 120, (240, 240, 240), -1)
cv2.circle(canvas, (1700, 650), 160, (245, 245, 245), -1)
ruido = np.random.randint(0, 25, canvas.shape, dtype=np.uint8)
canvas = cv2.add(canvas, ruido)
# Captura 1 (Izquierda) y Captura 2 (Desplazada 500px a la derecha)
foto1 = canvas[:, 0:1920]
foto2 = canvas[:, 500:2420]
cv2.imwrite("foto_01.jpg", foto1)
cv2.imwrite("foto_02.jpg", foto2)
print("✅ Generadas fotos de ráfaga orbital: 'foto_01.jpg' y 'foto_02.jpg'")
def construir_mosaico(f1_path="foto_01.jpg", f2_path="foto_02.jpg"):
"""Une dos imágenes en ráfaga creando un mapa panorámico de la superficie."""
if not Path(f1_path).exists() or not Path(f2_path).exists():
generar_rafaga_orbital()
img1 = cv2.imread(f1_path)
img2 = cv2.imread(f2_path)
# 1. Utilizar el motor Stitcher de OpenCV (Combina ORB, RANSAC y Blending)
stitcher = cv2.Stitcher_create(cv2.Stitcher_PANORAMA)
estado, mapa = stitcher.stitch([img1, img2])
if estado == cv2.Stitcher_OK:
nombre_salida = "mapa_planetario.jpg"
cv2.imwrite(nombre_salida, mapa)
print(f"✅ ¡Mapa planetario generado con éxito!: '{nombre_salida}'")
return True
else:
print(f"❌ Error al alinear las imágenes (Código de estado: {estado})")
return False
# Ejecutar composición del mapa
construir_mosaico()


Resultados de la Misión: Mapa Orbital Preliminar
Al ejecutar el programa, OpenCV detecta las coincidencias del terreno y genera el mapa panorámico unificado:
Plaintext
MAPA ORBITAL DE COBERTERA - BERMEJAPI SURVEY
┌─────────────────────────────────────────────┐
│ ☁☁ [CONTINENTE 1] │
│ ███████████ ☁☁ │
│ █ AGUA █ ░░░░░░░░░░ │
│ ███████████ ░ VEGETACIÓN ░ │
│ ░░░░░░░░░░ │
└─────────────────────────────────────────────┘
[Fase 1: foto_01.jpg] ∩ [Fase 2: foto_02.jpg]
El script guarda el resultado final en el archivo mapa_planetario.jpg, creando la primera cartografía real del territorio analizado.

Reto para la clase: El Escudo Invisible
Ya tenemos la masa, la atmósfera, la cobertura vegetativa y el mapa del terreno. Pero hay una amenaza espacial invisible: el viento estelar.
Si este planeta no tiene un campo magnético propio, la radiación terminará barriendo su atmósfera y destruyendo la vida.
En la Entrada 14 utilizaremos el magnetómetro del Sense HAT para medir la magnetosfera y buscar la “Anomalía Magnética” del planeta.



