OCR機能(文字認識機能)を使ってレシートの文字列を1行ずつ読み取りたい
受付中
回答 0
投稿
- 評価
- クリップ 0
- VIEW 779
前提・実現したいこと
OCRの機能を使い、レシートから文字を読み取るプログラムを作っている所です。
現時点の目標としては読み取られた文字列を1行ずつ読み取って改行するということです。(改行したことを示すために試しに「>>>」という記号を挿入します)
ですが、処理をするという部分において変数のエラーが出てしまい、処理が行われません。
発生している問題・エラーメッセージ
1行ずつ処理するプログラム↓
try { BufferedReader(ocr.text).use({ reader ->
var line: String? = null
while (reader.readLine().also({ line = it }) != null) {
println(">>>" + line)
}
})
} catch (e: IOException) {
e.printStackTrace()
}
ocr.text = ocr.text
その中のBufferdReader(ocr.text)の"ocr.text"部分がエラーであり、
Type mismatch.
Required:Reader!
Found:CharSequence!
と表示されます。
該当のソースコード
package com.example.recieptapp_android
//import androidx.exifinterface.media.ExifInterface
import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.media.ExifInterface
import android.os.Bundle
import android.widget.RadioButton
import androidx.appcompat.app.AppCompatActivity
import com.example.recieptapp_android.OCRUtil
import io.realm.Realm
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_yomitori.*
import java.io.BufferedReader
import java.io.IOException
import java.io.StringReader
class Yomitori : AppCompatActivity() {
private val REQUEST = 0
lateinit var ocrUtil: OCRUtil
private lateinit var realm: Realm
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_yomitori)
ocrUtil = OCRUtil(applicationContext)
button.setOnClickListener {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "image/*"
startActivityForResult(intent, REQUEST)
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST) {
if (resultCode == Activity.RESULT_OK && data != null) {
var bitmapOrigin: Bitmap? = null
var bitmap: Bitmap? = null
val uri = data.data
val uri2 = data.data
val uri3 = data.data
try {
uri?.let {
contentResolver.openFileDescriptor(it, "r").use { parcelFileDescriptorNullable ->
parcelFileDescriptorNullable?.let { parcelFileDescriptor ->
val fileDescriptor = parcelFileDescriptor.fileDescriptor
bitmapOrigin = BitmapFactory.decodeFileDescriptor(fileDescriptor)
contentResolver.openInputStream(it).use {
it?.let {
val exifInterface = ExifInterface(it)
val orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED)
val degrees = when (orientation) {
1 -> { 0f }
3 -> { 180f }
6 -> { 90f }
8 -> { 270f }
else -> { 0f }
}
val matrix = Matrix()
val imageWidth = bitmapOrigin?.getWidth() ?: 0
val imageHeight = bitmapOrigin?.getHeight() ?: 0
matrix.setRotate(degrees, imageWidth.toFloat() / 2, imageHeight.toFloat() / 2)
bitmap = Bitmap.createBitmap(bitmapOrigin!!, 0, 0, imageWidth, imageHeight, matrix, true)
}
}
}
}
}
bitmap?.let {
image.setImageBitmap(it)
val langId = radio_group.getCheckedRadioButtonId()
val langText = findViewById<RadioButton>(langId).text.toString()
ocr.text = ocrUtil.getString(applicationContext, it, OCRUtil.Companion.LangType.getLangType(langText).str)
// 1行ずつ処理するプログラム↓
try { BufferedReader(ocr.text).use({ reader ->
var line: String? = null
while (reader.readLine().also({ line = it }) != null) {
println(">>>" + line)
}
})
} catch (e: IOException) {
e.printStackTrace()
}
ocr.text = ocr.text
} ?: run {
ocr.text = "bitmap is null"
}
} catch (e: IOException) {
e.printStackTrace()
}
} else {
ocr.text = "system error"
}
}
}
}
試したこと
val langId = radio_group.getCheckedRadioButtonId()
val langText = findViewById<RadioButton>(langId).text.toString()
val LineText = ocr.text
ocr.text = ocrUtil.getString(applicationContext, it, OCRUtil.Companion.LangType.getLangType(langText).str)
// 1行ずつ処理するプログラム↓
try { BufferedReader(LineText).use({ reader ->
var line: String? = null
while (reader.readLine().also({ line = it }) != null) {
println(">>>" + line)
}
})
} catch (e: IOException) {
e.printStackTrace()
}
このように新たにLineTextという変数を使っておきかえてからtryの中に入れましたが、
上記のエラーと全く同じものが出てしまいました。
補足情報(FW/ツールのバージョンなど)
使っている開発環境はこちらになります。
Android Studio 3.6.3
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
まだ回答がついていません
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる