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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Pike8
April 27, 2024
Programming
200
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
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
290
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
530
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
150
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.5k
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
150
Family mrubyの進捗
kishima
1
110
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
650
Jetpack Compose メカニズム
skydoves
0
110
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
150
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
2.7k
新卒PdEのリアル
ryu1013
1
490
Featured
See All Featured
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Designing for humans not robots
tammielis
254
26k
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Odyssey Design
rkendrick25
PRO
2
800
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
780
Ruling the World: When Life Gets Gamed
codingconduct
0
330
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
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はカード類の読み込みに使える
おわり