Lumina : Bibliothèque de caméra Swift pour l'imagerie intégrée CoreML
Qu'est-ce que Lumina?
Lumina est un paquet Swift open‑source qui transforme un iPhone en un système de caméra complet d'un seul morceau de code. La bibliothèque repose sur les frameworks AVFoundation, Vision et CoreML d'Apple, mais dissimule les bas‑niveau derrière une API propre et conviviale pour Swift. Le résultat est un SDK qui :
- Capture photos statiques, photos en direct, vidéos et données de profondeur.
- Transmet chaque cadre à un délégué – idéal pour le traitement d'image en temps réel.
- Intègre tout modèle compatible CoreML et transmet les prédictions aux côtés des images vidéo.
- Détecte QR, codes-barres et visages immédiatement.
- Expose une interface utilisateur facile à ajuster et vous permet de remplacer les contrôles caméra par défaut.
Pourquoi utiliser Lumina ? • Éliminer le code boilerplate AVFoundation. • Prototyper rapidement des fonctionnalités de caméra alimentées par ML. • Se concentrer sur la logique de votre application plutôt que les détails internes de la caméra. • Bénéficier d’une bibliothèque bien maintenue et sous licence MIT fonctionnant sur iOS 13+.
Démarrage rapide
1. Installer le paquet
Ouvrir Xcode → Fichier → Ajouter des paquets… → entrer l’URL :
https://github.com/dokun1/Lumina.git
Choisir la Dernière version et ajouter la bibliothèque à votre cible.
Astuce : vous pouvez également épingler une balise précise si vous préférez des builds déterministes.
2. Ajouter les autorisations requises
Ajouter les clés suivantes à votre Info.plist :
<key>NSCameraUsageDescription</key>
<string>We need camera access to scan products.</string>
<key>NSMicrophoneUsageDescription</key>
<string>We need microphone access to record video.</string>
3. Insérer le contrôleur de vue
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)
// Optional: plug in a CoreML model
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("Photo captured: \(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)
}
}
C’est tout ! Appuyer sur le bouton d’obturateur capture une photo, le délégué reçoit l’image, et si vous avez branché un modèle, vous verrez les prédictions en temps réel superposées sur chaque cadre.
Récapitulatif des fonctionnalités
| Fonctionnalité | Comment l’activer | Ce que ça vous donne |
|---|---|---|
| Photo statique | cameraVC.recordsVideo = false |
Prendre une photo rapide |
| Photo en direct | cameraVC.captureLivePhotos = true; cameraVC.resolution = .photo |
Média riche avec profondeur |
| Enregistrement vidéo | cameraVC.recordsVideo = true |
Capturer vidéo 1080p ou 4K |
| Flux de profondeur | cameraVC.captureDepthData = true; cameraVC.resolution = .photo |
Post‑traitement des cartes de profondeur |
| QR/Cod‑barres | cameraVC.trackMetadata = true |
Retour d’appel de métadonnées automatiques |
| Détection faciale | Idem QR/Cod‑barres | Mettre en évidence les visages dans le cadre |
| Flux CoreML | cameraVC.streamingModels = [...] |
Reconnaissance d’objets en temps réel |
| UI personnalisée | cameraVC.setShutterButton(visible: false) etc. |
Remplacer les contrôles par défaut |
| Délégué | Implémenter LuminaDelegate |
Se connecter à tous les événements de capture |
L’application de démonstration dans le dépôt montre toutes les fonctionnalités dès le départ, alors expérimentez avec les paramètres dans l’éditeur de scènes Xcode.
Étendre Lumina
- Ajouter un nouveau modèle CoreML – Copier votre
.mlmodeldans le projet, créer une instanceLuminaModel, puis l’ajouter àstreamingModels. - Intégrer avec SwiftUI – Envelopper
LuminaViewControllerdans unUIViewControllerRepresentableet exposer un@Bindingpour l’état de la caméra. - Ajustement des performances – Modifier
frameRate,resolutionoumaxZoomScalepour correspondre aux capacités de votre appareil. - Issues ouvertes & contributions – Le dépôt suit une spécification de README standard ; n’hésitez pas à forker, ajouter des tests ou améliorer la documentation.
Pourquoi Lumina se démarque
| Critère | Lumina | Concurrent |
|---|---|---|
| Licence | MIT (ouverte, permissive) | Beaucoup commercial ou permissive, mais la licence de Lumina est l’une des plus simples |
| Boilerplate | Minimal (contrôleur unique) | Autres nécessitent plusieurs classes pour la gestion de session |
| Ensemble de fonctionnalités | CoreML, profondeur, photo en direct, QR / face en un seul lib | La plupart se concentrent soit sur la caméra soit sur le ML, pas les deux |
| Documentation | App de démonstration + README avec extraits de code | La qualité varie entre projets similaires |
Si vous développez une application iOS qui a besoin de capacités caméra et IA, Lumina vous permet de lancer un prototype en quelques minutes et garde votre base de code minimaliste.
Commencez dès aujourd’hui
- Clonez depuis GitHub :
git clone https://github.com/dokun1/Lumina.git - Explorez l’application
Samplepour une démonstration pratique. - Lisez le guide de contribution si vous souhaitez ajouter de nouvelles fonctionnalités ou corriger des bugs.
- Intégrez Lumina dans votre projet et commencez à construire des caméras plus intelligentes dès demain.
Question ? Posez une question sur l’onglet Discussions GitHub, ou contactez‑nous sur Twitter via @dokun1. Bon codage!