前言
导入依赖
implementation 'com.rmtheis:tess-two:9.1.0'
下载导入训练数据
调用
object TessUtil {
private const val LANGUAGE = "eng+chi_sim"
private val mDataPath = PathUtils.getExternalAppCachePath() + File.separator + "tesseract" + File.separator
fun textRecognition(imagePath: String, callback: Callback) {
textRecognition(ImageUtils.getBitmap(imagePath), callback)
}
fun textRecognition(bitmap: Bitmap, callback: Callback) {
ThreadUtils.getSinglePool()
.execute {
try {
val path = "${mDataPath}tessdata"
copyFont(path, "chi_sim.traineddata")
copyFont(path, "eng.traineddata")
val tessBaseAPI = TessBaseAPI()
tessBaseAPI.init(mDataPath, LANGUAGE)
tessBaseAPI.setImage(ImageUtils.toGray(bitmap))
val utF8Text = tessBaseAPI.utF8Text
ThreadUtils.runOnUiThread {
callback.success(utF8Text)
}
tessBaseAPI.clear()
} catch (e: Exception) {
ThreadUtils.runOnUiThread {
callback.failure(e)
}
}
}
}
private fun copyFont(path: String, fontName: String) {
FileUtils.createOrExistsDir(path)
val fontPath = path + File.separator + fontName
if (!FileUtils.isFileExists(fontPath)) {
ResourceUtils.copyFileFromAssets(fontName, fontPath)
}
}
interface Callback {
fun success(result: String)
fun failure(e: Exception) {
e.printStackTrace()
}
}
}
更新
修改依赖
- 选择其中一个导入,OpenMP简单理解,就是对多核CPU机器进行了优化,测试OpenMP识别速度更快一些。
// 使用标准
implementation 'cz.adaptech.tesseract4android:tesseract4android:4.1.1a'
// 使用OpenMP
implementation 'cz.adaptech.tesseract4android:tesseract4android-openmp:4.1.1a'
修改调用
object TessOCRUtils {
private const val LANGUAGE = "eng+chi_sim"
private val DATA_PATH = PathUtils.getExternalAppCachePath() + File.separator + "tesseract" + File.separator
fun textRecognition(imagePath: String, callback: Callback) {
textRecognition(ImageUtils.getBitmap(imagePath), callback)
}
fun textRecognition(bitmap: Bitmap, callback: Callback) {
ThreadUtils.getSinglePool()
.execute {
try {
val path = "${DATA_PATH}tessdata"
copyFont(path, "chi_sim.traineddata")
copyFont(path, "eng.traineddata")
val tessBaseAPI = TessBaseAPI()
if (!tessBaseAPI.init(DATA_PATH, LANGUAGE)) {
tessBaseAPI.recycle()
throw RuntimeException("tess初始化失败")
} else {
val gray = ImageUtils.toGray(bitmap)
tessBaseAPI.setImage(gray)
val utF8Text = tessBaseAPI.utF8Text
ThreadUtils.runOnUiThread {
callback.success(utF8Text)
}
tessBaseAPI.recycle()
}
} catch (e: Exception) {
ThreadUtils.runOnUiThread {
callback.failure(e)
}
}
}
}
private fun copyFont(path: String, fontName: String) {
FileUtils.createOrExistsDir(path)
val fontPath = path + File.separator + fontName
if (!FileUtils.isFileExists(fontPath)) {
ResourceUtils.copyFileFromAssets(fontName, fontPath)
}
}
interface Callback {
fun success(result: String)
fun failure(e: Exception) {
e.printStackTrace()
}
}
}