Lumina: Biblioteca de cámara Swift para imágenes integradas con CoreML
¿Qué es Lumina?
Lumina es un paquete Swift de código abierto que convierte un iPhone en un sistema de cámara totalmente funcional con una sola línea de código. La biblioteca se construye sobre los frameworks AVFoundation, Vision y CoreML de Apple, pero oculta la infraestructura de bajo nivel detrás de una API limpia y amigable con Swift. El resultado es un SDK que:
- Captura fotos fijas, Live Photo, vídeo y datos de profundidad.
- Transmite cada fotograma a un delegado – perfecto para procesamiento de imágenes en tiempo real.
- Integra cualquier modelo compatible con CoreML y transmite las predicciones junto con los fotogramas.
- Detecta códigos QR, códigos de barras y rostros de inmediato.
- Expose una interfaz de usuario fácil de ajustar y permite reemplazar los controles de cámara predeterminados.
¿Por qué usar Lumina? • Elimina el código repetitivo de AVFoundation. • Prototipa rápidamente funciones de cámara impulsadas por ML. • Enfócate en la lógica de tu aplicación en lugar de los detalles internos de la cámara. • Benefíciate de una biblioteca bien mantenida, con licencia MIT, que funciona en iOS 13+.
Inicio rápido
1. Instalar el paquete
Abrir Xcode → File → Add Packages… → introducir la URL:
https://github.com/dokun1/Lumina.git
Elegir la Última Versión y agregar la librería a tu objetivo.
Tip: También puedes fijar una etiqueta específica si quieres construcciones determinísticas.
2. Añadir los permisos requeridos
Añadir las siguientes claves a tu Info.plist:
<key>NSCameraUsageDescription</key>
<string>Necesitamos acceso a la cámara para escanear productos.</string>
<key>NSMicrophoneUsageDescription</key>
<string>Necesitamos acceso al micrófono para grabar vídeo.</string>
3. Agregar el controlador de vista
import UIKit
import Lumina
class CameraDemoViewController: UIViewController, LuminaDelegate {
private var cameraVC: LuminaViewController!
override func viewDidLoad() {
super.viewDidLoad()
cameraVC = LuminaViewController()
cameraVC.delegate = self
cameraVC.setShutterButton(visible: true)
cameraVC.setTorchButton(visible: true)
// Opcional: conectar un modelo CoreML
if let model = try? MobileNet().model {
cameraVC.streamingModels = [LuminaModel(model: model, type: "MobileNet")]
}
present(cameraVC, animated: true, completion: nil)
}
// MARK: – LuminaDelegate
func captured(stillImage: UIImage, livePhotoAt: URL?, depthData: Any?, from controller: LuminaViewController) {
print("Foto capturada: \(stillImage.size)")
controller.dismiss(animated: true, completion: nil)
}
func streamed(videoFrame: UIImage, with predictions: [LuminaRecognitionResult]?, from controller: LuminaViewController) {
guard let predictions = predictions else { return }
var overlayText = ""
for pred in predictions {
guard let best = pred.predictions?.first else { continue }
overlayText += "\(pred.type): \(best.name) (\(String(format: "%.2f", best.probability * 100))%)\n"
}
controller.textPrompt = overlayText
}
func dismissed(controller: LuminaViewController) {
controller.dismiss(animated: true, completion: nil)
}
}
Eso es todo! Pulsar el botón de obturador toma una foto, el delegado recibe la imagen, y si conectaste un modelo, verás predicciones en vivo sobre cada fotograma.
Resumen de funciones
| Función | Cómo habilitarla | Lo que obtienes |
|---|---|---|
| Foto fija | cameraVC.recordsVideo = false |
Capturar una instantánea rápida |
| Live Photo | cameraVC.captureLivePhotos = true; cameraVC.resolution = .photo |
Medios enriquecidos con profundidad |
| Grabación de vídeo | cameraVC.recordsVideo = true |
Capturar vídeo 1080p o 4K |
| Transmisión de profundidad | cameraVC.captureDepthData = true; cameraVC.resolution = .photo |
Mapas de profundidad post‑procesados |
| QR/Código de barras | cameraVC.trackMetadata = true |
Llamadas automáticas de metadatos |
| Detección de rostros | Igual que QR/Código de barras | Resaltar rostros en el fotograma |
| Transmisión CoreML | cameraVC.streamingModels = [...] |
Reconocimiento de objetos en tiempo real |
| UI personalizada | cameraVC.setShutterButton(visible: false) etc. |
Reemplazar los controles predeterminados |
| Delegado | Implementar LuminaDelegate |
Conectar todos los eventos de captura |
La aplicación de muestra del repositorio demuestra cada función de inmediato, así que experimenta con los ajustes en el Editor de Escenas de Xcode.
Extender Lumina
- Añadir un nuevo modelo CoreML – Copia tu .mlmodel al proyecto, crea una instancia de
LuminaModel, y añádela astreamingModels. - Integrar con SwiftUI – Envuelve
LuminaViewControlleren unUIViewControllerRepresentabley expón un@Bindingpara el estado de la cámara. - Ajuste de rendimiento – Ajusta
frameRate,resolutionomaxZoomScalepara adaptarte a las capacidades de tu dispositivo. - Issues abiertos y contribuciones – El repositorio sigue una especificación estándar de README; siéntete libre de forkar, añadir pruebas o mejorar la documentación.
Por qué Lumina destaca
| Criterio | Lumina | Competidores |
|---|---|---|
| Licencia | MIT (abierto, permisivo) | Muchos son comerciales o permisivos, pero la licencia de Lumina es una de las más directas |
| Boilerplate | Mínimo (controlador de una sola línea) | Otros requieren varias clases para la gestión de la sesión |
| Conjunto de funciones | CoreML, profundidad, Live Photo, QR/rostro en una sola librería | La mayoría se centra en cámara o ML, no en ambos |
| Documentación | Aplicación de muestra + README con fragmentos de código | La calidad de la documentación varía entre proyectos similares |
Si estás construyendo una app iOS que necesita capacidades de cámara y IA, Lumina te permite crear un prototipo en minutos y mantener tu base de código ligera.
Comienza hoy
- Clonar desde GitHub:
git clone https://github.com/dokun1/Lumina.git - Explorar la app
Samplepara un demo práctico. - Leer la guía de contribución si quieres agregar nuevas funciones o arreglar errores.
- Añadir Lumina a tu propio proyecto y comenzar a construir cámaras más inteligentes mañana.
¿Pregunta? Publica una pregunta en la pestaña Discusiones de GitHub, o ponte en contacto en Twitter vía @dokun1. ¡Feliz codificación!