Lumina: Swift Camera Library for CoreML Integrated Imaging
What is Lumina?
Lumina は、Swift のオープンソースパッケージで、1 行コードで iPhone をフル機能のカメラシステムに変えます。Apple の AVFoundation、Vision、CoreML フレームワークをベースに、低レベルの処理をクリーンで Swift 風の API の背後に隠しています。結果として、以下の機能を備えた SDK が実現します。
- 静止画像、ライブ写真、動画と深度データの取得。
- すべてのフレームをデリゲートへストリーム – リアルタイム画像処理に最適。
- CoreML 互換モデルを統合し、予測を動画フレームと同時にストリーム。
- QR コード・バーコード・顔認識を標準でサポート。
- カスタマイズしやすい UI を公開し、デフォルトのカメラコントロールを置き換え可能。
Lumina を選ぶ理由 • AVFoundation のボイラープレートを排除。 • ML 搭載カメラ機能を迅速にプロトタイピング。 • カメラ内部に関わらず、アプリロジックに集中可能。 • MIT ライセンスで、iOS 13+ で動作するよく維持されたライブラリを利用可。
Quick Start
1. パッケージをインストール
Xcode → File → Add Packages… → URL を入力:
https://github.com/dokun1/Lumina.git
最新リリースを選び、ターゲットにライブラリを追加します。
Tip: デターミニスティックビルドを望む場合は、特定のタグを固定できます。
2. 必要なパーミッションを追加
Info.plist に以下のキーを追加します。
<key>NSCameraUsageDescription</key>
<string>商品をスキャンするためにカメラアクセスが必要です。</string>
<key>NSMicrophoneUsageDescription</key>
<string>動画を録画するためにマイクアクセスが必要です。</string>
3. ビューメネージャーをドロップ
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)
}
}
これで完了です! シャッターボタンをタップすると写真が撮れ、デリゲートで画像を受け取り、モデルを組み込んでいれば、各フレームにライブ予測が重ねられます。
Feature Rundown
| Feature | How to enable | What it gives you |
|---|---|---|
| Still Photo | cameraVC.recordsVideo = false |
すばやくスナップショットを撮る |
| Live Photo | cameraVC.captureLivePhotos = true; cameraVC.resolution = .photo |
深度を含むリッチメディア |
| Video Recording | cameraVC.recordsVideo = true |
1080p または 4K 動画を撮影 |
| Depth Stream | cameraVC.captureDepthData = true; cameraVC.resolution = .photo |
深度マップのポストプロセス |
| QR/Barcode | cameraVC.trackMetadata = true |
自動メタデータコールバック |
| Face Detection | 同上 | フレーム内の顔をハイライト |
| CoreML Streaming | cameraVC.streamingModels = [...] |
リアルタイムオブジェクト認識 |
| Custom UI | cameraVC.setShutterButton(visible: false) など |
デフォルトコントロールを置き換え |
| Delegate | LuminaDelegate を実装 |
すべてのキャプチャイベントにフック |
リポジトリのサンプルアプリはデフォルトですべての機能を示しているため、Xcode の Scene Editor で設定を試してください。
Extending Lumina
- 新しい CoreML モデルを追加 – .mlmodel をプロジェクトへコピーし、
LuminaModelを生成してstreamingModelsに追加。 - SwiftUI と連携 –
LuminaViewControllerをUIViewControllerRepresentableにラップし、カメラ状態の@Bindingを公開。 - パフォーマンス調整 –
frameRate、resolution、maxZoomScaleをデバイスの性能に合わせて調整。 - Issue & コントリビューション – README 仕様に従い、フォーク、テスト追加、ドキュメント改良を歓迎。
Why Lumina Stands Out
| Criterion | Lumina | Competitors |
|---|---|---|
| License | MIT (オープン、寛容) | ほとんどが商用または寛容だが、Lumina のライセンスは最もシンプル |
| Boilerplate | 最小限(単一ファイルコントローラ) | 他社はセッション管理用に複数クラスを必要とする |
| Feature‑set | CoreML、深度、ライブ写真、QR/顔を一つの lib | 多くはカメラか ML どちらかに集中 |
| Documentation | サンプルアプリ + コードスニペット付き README | 同様のプロジェクトでドキュメントの品質はばらつき |
iOS アプリでカメラと AI 機能が必要な場合、Lumina は数分でプロトタイプを作成でき、コードベースを軽量に保ちます。
Get Started Today
- GitHub からクローン:
git clone https://github.com/dokun1/Lumina.git Sampleアプリで実際に体験。- コントリビューションガイドを読むと、新しい機能やバグ修正に取り掛かれます。
- Lumina を自分のプロジェクトに組み込み、翌日からスマートなカメラを構築開始。
質問? GitHub Discussions タブで質問を投稿するか、Twitter の @dokun1 へ問い合わせてください。Happy coding!
元の記事:
オリジナルを見る