- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是一名学生,也是 android 开发的初学者,需要为我的学校项目的联系人管理应用程序执行 android OCR 功能。这是为了将名片中的图像转换为文本。
我在许多论坛上搜索了有关这方面的信息,并找到了几个很好的例子。
目前我在网上找到了一个开源代码,不需要设置ndk和环境变量等来设置。然而,当我将它实现到 eclipse(juno) 中时,出现了一个小错误,我不确定如何解决。
我在谷歌上搜索了很长时间,没有任何结果。因此,决定在这里问问。以下是有错误的代码。
final class OcrRecognizeAsyncTask extends AsyncTask<Void, Void, Boolean> {
// private static final boolean PERFORM_FISHER_THRESHOLDING = false;
// private static final boolean PERFORM_OTSU_THRESHOLDING = false;
// private static final boolean PERFORM_SOBEL_THRESHOLDING = false;
private CaptureActivity activity;
private TessBaseAPI baseApi;
private byte[] data;
private int width;
private int height;
private OcrResult ocrResult;
private long timeRequired;
OcrRecognizeAsyncTask(CaptureActivity activity, TessBaseAPI baseApi, byte[] data, int width, int height) {
this.activity = activity;
this.baseApi = baseApi;
this.data = data;
this.width = width;
this.height = height;
}
@Override
protected Boolean doInBackground(Void... arg0) {
long start = System.currentTimeMillis();
Bitmap bitmap = activity.getCameraManager().buildLuminanceSource(data, width, height).renderCroppedGreyscaleBitmap();
String textResult;
// if (PERFORM_FISHER_THRESHOLDING) {
// Pix thresholdedImage = Thresholder.fisherAdaptiveThreshold(ReadFile.readBitmap(bitmap), 48, 48, 0.1F, 2.5F);
// Log.e("OcrRecognizeAsyncTask", "thresholding completed. converting to bmp. size:" + bitmap.getWidth() + "x" + bitmap.getHeight());
// bitmap = WriteFile.writeBitmap(thresholdedImage);
// }
// if (PERFORM_OTSU_THRESHOLDING) {
// Pix thresholdedImage = Binarize.otsuAdaptiveThreshold(ReadFile.readBitmap(bitmap), 48, 48, 9, 9, 0.1F);
// Log.e("OcrRecognizeAsyncTask", "thresholding completed. converting to bmp. size:" + bitmap.getWidth() + "x" + bitmap.getHeight());
// bitmap = WriteFile.writeBitmap(thresholdedImage);
// }
// if (PERFORM_SOBEL_THRESHOLDING) {
// Pix thresholdedImage = Thresholder.sobelEdgeThreshold(ReadFile.readBitmap(bitmap), 64);
// Log.e("OcrRecognizeAsyncTask", "thresholding completed. converting to bmp. size:" + bitmap.getWidth() + "x" + bitmap.getHeight());
// bitmap = WriteFile.writeBitmap(thresholdedImage);
// }
try {
baseApi.setImage(ReadFile.readBitmap(bitmap));
textResult = baseApi.getUTF8Text();
timeRequired = System.currentTimeMillis() - start;
// Check for failure to recognize text
if (textResult == null || textResult.equals("")) {
return false;
}
ocrResult = new OcrResult();
ocrResult.setWordConfidences(baseApi.wordConfidences());
ocrResult.setMeanConfidence( baseApi.meanConfidence());
ocrResult.setRegionBoundingBoxes(baseApi.getRegions().getBoxRects());
ocrResult.setTextlineBoundingBoxes(baseApi.getTextlines().getBoxRects());
ocrResult.setWordBoundingBoxes(baseApi.getWords().getBoxRects());
ocrResult.setStripBoundingBoxes(baseApi.getStrips().getBoxRects());
// Iterate through the results.
final ResultIterator iterator = baseApi.getResultIterator();
int[] lastBoundingBox;
ArrayList<Rect> charBoxes = new ArrayList<Rect>();
iterator.begin();
do {
lastBoundingBox =iterator.getBoundingBox(PageIteratorLevel.RIL_SYMBOL);
Rect lastRectBox = new Rect(lastBoundingBox[0], lastBoundingBox[1],
lastBoundingBox[2], lastBoundingBox[3]);
charBoxes.add(lastRectBox);
} while (iterator.next(PageIteratorLevel.RIL_SYMBOL));
iterator.delete();
ocrResult.setCharacterBoundingBoxes(charBoxes);
} catch (RuntimeException e) {
Log.e("OcrRecognizeAsyncTask", "Caught RuntimeException in request to Tesseract. Setting state to CONTINUOUS_STOPPED.");
e.printStackTrace();
try {
baseApi.clear();
activity.stopHandler();
} catch (NullPointerException e1) {
// Continue
}
return false;
}
timeRequired = System.currentTimeMillis() - start;
ocrResult.setBitmap(bitmap);
ocrResult.setText(textResult);
ocrResult.setRecognitionTimeRequired(timeRequired);
return true;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
Handler handler = activity.getHandler();
if (handler != null) {
// Send results for single-shot mode recognition.
if (result) {
Message message = Message.obtain(handler, R.id.ocr_decode_succeeded, ocrResult);
message.sendToTarget();
} else {
Message message = Message.obtain(handler, R.id.ocr_decode_failed, ocrResult);
message.sendToTarget();
}
activity.getProgressDialog().dismiss();
}
if (baseApi != null) {
baseApi.clear();
}
}
}
错误在于 do 和 while 循环:
do {
lastBoundingBox = iterator.***getBoundingBox***(PageIteratorLevel.RIL_SYMBOL);
Rect lastRectBox = new Rect(lastBoundingBox[0], lastBoundingBox[1],
lastBoundingBox[2], lastBoundingBox[3]);
charBoxes.add(lastRectBox);
} while (iterator.next(PageIteratorLevel.RIL_SYMBOL));
iterator.***delete***();
ocrResult.setCharacterBoundingBoxes(charBoxes);
在上面加粗的代码中,getBoundingBox 和 delete 有如下错误:
“未为 ResultIterator 类型定义方法 getBoundingBox(int)”
“未为 ResultIterator 类型定义方法 getBoundingBox(int)”
我尝试了几种方法,但就是无法解决问题。如果有任何解决方案,请帮助我,非常感谢。
最佳答案
@SebastianRoth 是对的:您使用的预编译库已过时。我建议安装 NDK 并遵循 build instructions对于 OCR 引擎。这将重新编译库,包括它的 getBoundingBox
方法。
关于安卓 OCR : Cannot resolve error for getBoundingBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34125391/
reqwest v0.9 将 serde v1.0 作为依赖项,因此实现 converting serde_json errors into reqwest error . 在我的代码中,我使用 se
我有这个代码: let file = FileStorage { // ... }; file.write("Test", bytes.as_ref()) .map_err(|e| Mu
我只是尝试用angular-cli创建一个新项目,然后运行服务器,但是它停止并显示一条有趣的消息:Error: No errors。 我以这种方式更新了(希望有帮助):npm uninstall -g
我从我的 javascript 发送交易 Metamask 打开传输对话框 我确定 i get an error message in metamask (inpage.js:1 MetaMask -
这个问题在这里已经有了答案: How do you define custom `Error` types in Rust? (3 个答案) How to get a reference to a
我想知道两者之间有什么大的区别 if let error = error{} vs if error != nil?或者只是人们的不同之处,比如他们如何用代码表达自己? 例如,如果我使用这段代码: u
当我尝试发送超过 50KB 的图像时,我在 Blazor 服务器应用程序上收到以下错误消息 Error: Connection disconnected with error 'Error: Serv
我有一个error-page指令,它将所有异常重定向到错误显示页面 我的web.xml: [...] java.lang.Exception /vi
我有这样的对象: address: { "phone" : 888, "value" : 12 } 在 WHERE 中我需要通过 address.value 查找对象,但是在 SQL 中有函数
每次我尝试编译我的代码时,我都会遇到大量错误。这不是我的代码的问题,因为它在另一台计算机上工作得很好。我尝试重新安装和修复,但这没有帮助。这是整个错误消息: 1>------ Build starte
在我的代码的类部分,如果我写一个错误,则在不应该的情况下,将有几行报告为错误。我将'| error'放在可以从错误中恢复的良好/安全位置,但是我认为它没有使用它。也许它试图在某个地方恢复中间表情? 有
我遇到了 csv 输入文件整体读取故障的问题,我可以通过在 read_csv 函数中添加 "error_bad_lines=False" 来删除这些问题来解决这个问题。 但是我需要报告这些造成问题的文
在 Spring 中,验证后我们在 controller 中得到一个 BindingResult 对象。 很简单,如果我收到验证错误,我想重新显示我的表单,并在每个受影响的字段上方显示错误消息。 因此
我不知道出了什么问题,因为我用 Java 编程了大约一年,从来没有遇到过这个错误。在一分钟前在 Eclipse 中编译和运行工作,现在我得到这个错误: #A fatal error has been
SELECT to_char(messages. TIME, 'YYYY/MM/DD') AS FullDate, to_char(messages. TIME, 'MM/DD
我收到这些错误: AnonymousPath\Anonymized.vb : error BC30037: Character is not valid. AnonymousPath\Anonymiz
我刚刚安装了 gridengine 并在执行 qstat 时出现错误: error: commlib error: got select error (Connection refused) erro
嗨,我正在学习 PHP,我从 CRUD 系统开始,我在 Windows 上安装了 WAMP 服务器,当我运行它时,我收到以下错误消息。 SCREAM: Error suppression ignore
我刚刚开始一个新项目,我正在学习核心数据教程,可以找到:https://www.youtube.com/watch?v=zZJpsszfTHM 我似乎无法弄清楚为什么会抛出此错误。我有一个名为“Exp
当我使用 Jenkins 运行新构建时,出现以下错误: "FilePathY\XXX.cpp : fatal error C1853: 'FilePathZ\XXX.pch' precompiled
我是一名优秀的程序员,十分优秀!