Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ML Kit Document Scannerを導入してみた
Search
Pike8
April 27, 2024
Programming
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ML Kit Document Scannerを導入してみた
Pike8
April 27, 2024
More Decks by Pike8
See All by Pike8
20240807 NOT A HOTEL TECH TALK オーナーアプリ
pike8
0
150
Other Decks in Programming
See All in Programming
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
160
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
2
600
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
170
AmebaブログはKMPから卒業します
kmars0605
0
190
カツオ、ご期待ください
suneo3476
0
190
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
230
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
3.7k
Domain-Driven Transformation
hschwentner
2
2.3k
JIS keyboard support in Omarchy
lef237
0
120
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
310
Featured
See All Featured
How to Talk to Developers About Accessibility
jct
2
580
Deep Space Network (abreviated)
tonyrice
0
370
Typedesign – Prime Four
hannesfritz
42
3.2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
We Have a Design System, Now What?
morganepeng
55
8.4k
The Curse of the Amulet
leimatthew05
3
16k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
710
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
So, you think you're a good person
axbom
PRO
2
2.2k
Transcript
池永 健 一 ML Kit Document Scanner を導 入 してみた
potatotips # 8 7
自 己 紹介 Androidエンジニア NOT A HOTEL株式会社 物件に宿泊するためのアプリを開発 @pikehachi 池永
健 一
やりたいこと 免許証をアップロードしたい 免許証画像 免許証番号と有効期限
やりたいこと 免許証画像 カメラで免許証を認識したら 自 動で取り込みたい 免許証番号と有効期限 免許証画像から 自 動で 入力
したい
実現 方 法 免許証画像 カメラで免許証を認識したら 自 動で取り込みたい ??? 免許証番号と有効期限 免許証画像から
自 動で 入力 したい ML Kitテキスト認識で可能
技術検証 ライブラリの利 用 CameraX + OpenCVによる矩形認識
技術検証 ライブラリの利 用 免許証認識ライブラリ for Android 定価 600,000円 + 税
CameraX + OpenCVによる矩形認識
技術検証 ライブラリの利 用 CameraX + OpenCVによる矩形認識 実装可能だが、パラメータの調整も含めると作業量が多い 矩形がどの範囲にどの程度の時間留まったら取り込むか 矩形の歪みをどれくらい許容するか
ML Kit Document Scanner βリリース 2 0 2 4 /
2 / 2 0
主な機能 ドキュメントを検出して 自 動キャプチャ エッジを検出して 自 動切り抜き ドキュメントの向きを 自 動補正
さらにアプリからカメラへの権限は不要
実装 @Composable fun DriverLicenseImageSelectButton( selectDriverLicenseImage: (Uri) -> Unit, modifier: Modifier
= Modifier, ) { val context = LocalContext.current val documentScannerLauncher = rememberLauncherForActivityResult( ActivityResultContracts.StartIntentSenderForResult(), ) { activityResult -> activityResult.getSelectedImage()?.let(selectDriverLicenseImage) } Box( contentAlignment = Alignment.Center, modifier = modifier // Χʔυͷ֎؍Λઃఆ .clickable { documentScannerLauncher.launchDocumentScan(context) } ) { // ΧʔυͷதΛදࣔ } } private fun ActivityResult.getSelectedImage(): Uri? { // ࡱӨ͞Εͨը૾ΛऔΓग़͢ } private fun ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>.launchDocumentScan( context: Context ) { // Document ScannerΛىಈ }
実装 @Composable fun DriverLicenseImageSelectButton( selectDriverLicenseImage: (Uri) -> Unit, modifier: Modifier
= Modifier, ) { } private fun ActivityResult.getSelectedImage(): Uri? { if (resultCode != Activity.RESULT_OK) { return null } val result = GmsDocumentScanningResult.fromActivityResultIntent(data) return result?.pages?.firstOrNull()?.imageUri } private fun ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>.launchDocumentScan( context: Context ) { // Document ScannerΛىಈ } // …
実装 } private fun ManagedActivityResultLauncher<IntentSenderRequest, ActivityResult>.launchDocumentScan( context: Context ) {
val activity = context.findActivity() ?: return val options = GmsDocumentScannerOptions.Builder() // Χϝϥ͚ͩͰͳ͘ΪϟϥϦʔ͔Βը૾ͷऔΓࠐΈ͕Ͱ͖Δ .setGalleryImportAllowed(true) // ෳϖʔδΛอଘ͢Δ͜ͱ͕Ͱ͖Δ .setPageLimit(1) // JPEGͷଞʹPDFͰͷอଘ͕Ͱ͖Δ .setResultFormats(GmsDocumentScannerOptions.RESULT_FORMAT_JPEG) // औΓࠐΜͩը૾ʹར༻͢ΔฤूػೳΛબ͢Δʢޙड़ʣ .setScannerMode(GmsDocumentScannerOptions.SCANNER_MODE_BASE) .build() val scanner = GmsDocumentScanning.getClient(options) scanner.getStartScanIntent(activity).addOnSuccessListener { intentSender -> this.launch(IntentSenderRequest.Builder(intentSender).build()) } } @Composable fun DriverLicenseImageSelectButton( selectDriverLicenseImage: (Uri) -> Unit, modifier: Modifier = Modifier, ) { } private fun ActivityResult.getSelectedImage(): Uri? { // … // …
デモ Document Scanner Document Scanner ΞϓϦUI
ScannerMode 切り抜きと回転 (BASE) フィルタ (BASE or FILTER) グレースケール、 自 動画像補正など
汚れ除去 (BASE or FILTER or FULL) 汚れ、影や指の消去など
PlayServices 非 対応時の処理 地域や端末によりPlayServicesが 非 対応時 Photo Pickerにフォールバック
まとめ ML Kit Document Scannerはカード類の読み込みに使える
おわり