我正在开发一个移动应用程序,我正在尝试从相机捕获的图像中提取抄表。
我做过研究并经过反复试验,最后决定使用Google的Mobile Vision API代替tesseract-ocr或OpenCV
所以我使用Mobile Vision API提供的Text Recognition API开发了一个小应用程序。这是代码。
if (detector.isOperational() && bitmap != null) {
imageView.setImageBitmap((Bitmap) data.getExtras().get("data"));
Frame frame = new Frame.Builder().setBitmap(bitmap).build();
SparseArray<TextBlock> textBlocks = detector.detect(frame);
String blocks = "";
String lines = "";
String words = "";
for (int index = 0; index < textBlocks.size(); index++) {
//extract scanned text blocks here
TextBlock tBlock = textBlocks.valueAt(index);
blocks = blocks + tBlock.getValue() + "\n" + "\n";
for (Text line : tBlock.getComponents()) {
//extract scanned text lines here
lines = lines + line.getValue() + "\n";
for (Text element : line.getComponents()) {
//extract scanned integer here
if(element.getValue().matches("\\d+")){
words = words + element.getValue();
}
}
}
}
if (textBlocks.size() == 0) {
scanResults.setText("Scan Failed: Found nothing to scan");
} else {
scanResults.setText(scanResults.getText() + "Blocks: " + "\n");
scanResults.setText(scanResults.getText() + blocks + "\n");
scanResults.setText(scanResults.getText() + "---------" + "\n");
scanResults.setText(scanResults.getText() + "Lines: " + "\n");
scanResults.setText(scanResults.getText() + lines + "\n");
scanResults.setText(scanResults.getText() + "---------" + "\n");
scanResults.setText(scanResults.getText() + "Words: " + "\n");
scanResults.setText(scanResults.getText() + words + "\n");
scanResults.setText(scanResults.getText() + "---------" + "\n");
}
} else {
scanResults.setText("Could not set up the detector!");
}
一切正常,但无法从下方图片中读取标记区域的数字。
我试图将灰度图像传递给探测器,但它没有用。
请建议我如何使文字可读。
答案 0 :(得分:0)
您所要做的就是首先提取其中包含数字的行,然后需要删除不是数字或字母的所有字符并构建字符串,而不是需要检查此字符串中的每个字符以查看如果它的前面或后面包含一个字母,如果存在一个比您分析的字符无效的字母,则它无效。它对我有用,但仍然缺乏检测稳定性。
我希望这能回答您的问题