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

  1. Añadir un nuevo modelo CoreML – Copia tu .mlmodel al proyecto, crea una instancia de LuminaModel, y añádela a streamingModels.
  2. Integrar con SwiftUI – Envuelve LuminaViewController en un UIViewControllerRepresentable y expón un @Binding para el estado de la cámara.
  3. Ajuste de rendimiento – Ajusta frameRate, resolution o maxZoomScale para adaptarte a las capacidades de tu dispositivo.
  4. 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 Sample para 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!

Artículo original: Ver original

Compartir este artículo