私はチュートリアルに従って、Android用Googleのモバイルビジョンを実装しました。私は領収書をスキャンし、数値の合計を見つけるアプリケーションを構築しようとしています。しかし、異なるフォーマットで印刷された異なるレシートをスキャンすると、APIはTextBlocksを任意の方法で検出します。たとえば、1つの領収書で、複数の単語の単語が単一のスペースで区切られている場合、それらは単一のTextBlockにグループ化されます。しかし、2つの単語の単語が空白で区切られている場合、それらは同じ "行"に表示されますが、独立したTextBlockとして区切られます。私がしようとしているのは、APIが領収書の各行全体を単一のエンティティとして認識するようにすることです。これは可能ですか?Android用モバイルビジョンでテキストの全文を読むように強制する方法
2
A
答えて
0
public ArrayList<T> getAllGraphicsInRow(float rawY) {
synchronized (mLock) {
ArrayList<T> row = new ArrayList<>();
// Get the position of this View so the raw location can be offset relative to the view.
int[] location = new int[2];
this.getLocationOnScreen(location);
for (T graphic : mGraphics) {
float rawX = this.getWidth();
for (int i=0; i<rawX; i+=10){
if (graphic.contains(i - location[0], rawY - location[1])) {
if(!row.contains(graphic)) {
row.add(graphic);
}
}
}
}
return row;
}
}
これはGraphicOverlay.javaファイル内にあり、基本的にその行のすべてのグラフィックスを取得します。
public static boolean almostEqual(double a, double b, double eps){
return Math.abs(a-b)<(eps);
}
public static boolean pointAlmostEqual(Point a, Point b){
return almostEqual(a.y,b.y,10);
}
public static boolean cornerPointAlmostEqual(Point[] rect1, Point[] rect2){
boolean almostEqual=true;
for (int i=0; i<rect1.length;i++){
if (!pointAlmostEqual(rect1[i],rect2[i])){
almostEqual=false;
}
}
return almostEqual;
}
private boolean onTap(float rawX, float rawY) {
String priceRegex = "(\\d+[,.]\\d\\d)";
ArrayList<OcrGraphic> graphics = mGraphicOverlay.getAllGraphicsInRow(rawY);
OcrGraphic currentGraphics = mGraphicOverlay.getGraphicAtLocation(rawX,rawY);
if (graphics !=null && currentGraphics!=null) {
List<? extends Text> currentComponents = currentGraphics.getTextBlock().getComponents();
final Pattern pattern = Pattern.compile(priceRegex);
final Pattern pattern1 = Pattern.compile(priceRegex);
TextBlock text = null;
Log.i("text results", "This many in the row: " + Integer.toString(graphics.size()));
ArrayList<Text> combinedComponents = new ArrayList<>();
for (OcrGraphic graphic : graphics) {
if (!graphic.equals(currentGraphics)) {
text = graphic.getTextBlock();
Log.i("text results", text.getValue());
combinedComponents.addAll(text.getComponents());
}
}
for (Text currentText : currentComponents) { // goes through components in the row
final Matcher matcher = pattern.matcher(currentText.getValue()); // looks for
Point[] currentPoint = currentText.getCornerPoints();
for (Text otherCurrentText : combinedComponents) {//Looks for other components that are in the same row
final Matcher otherMatcher = pattern1.matcher(otherCurrentText.getValue()); // looks for
Point[] innerCurrentPoint = otherCurrentText.getCornerPoints();
if (cornerPointAlmostEqual(currentPoint, innerCurrentPoint)) {
if (matcher.find()) { // if you click on the price
Log.i("oh yes", "Item: " + otherCurrentText.getValue());
Log.i("oh yes", "Value: " + matcher.group(1));
itemList.add(otherCurrentText.getValue());
priceList.add(Float.valueOf(matcher.group(1)));
}
if (otherMatcher.find()) { // if you click on the item
Log.i("oh yes", "Item: " + currentText.getValue());
Log.i("oh yes", "Value: " + otherMatcher.group(1));
itemList.add(currentText.getValue());
priceList.add(Float.valueOf(otherMatcher.group(1)));
}
Toast toast = Toast.makeText(this, " Text Captured!" , Toast.LENGTH_SHORT);
toast.show();
}
}
}
return true;
}
return false;
}
これはOcrCaptureActivity.javaであるべきであり、それが行にテキストブロックを分割し、成分が全ての価格であり、それに応じてすべての値を出力した場合のラインをチェック同じ行のブロックを見つけます。
almostEqualのeps値は、行内のグラフィックスを確認するための許容差です。
+0
これは、テキスト認識APIのクラスCameraSourcePreviewとGraphicOverlayを使用する必要があるため、既存のイメージとは対照的にカメラアプリケーションをリアルタイムで使用する場合にのみ有効です。 – DaveNOTDavid
関連する問題
- 1. アリアのタグ - スクリーンリーダーでテキストを読むように強制する
- 2. kafkaの特定のパーティションを読むように消費者を強制する方法
- 3. アンロードされたモジュールのシンボルを読み込むようWinDbgに強制する
- 4. ページをIFrame内でのみ強制的に読み込む方法は?
- 5. テキストをスピーチasp.netに読み込むことを強調する方法?
- 6. 次の行でテキストを強制的に破る方法は?
- 7. AxisクライアントでTLSv1.2プロトコルを使用するように強制する方法
- 8. Androidのエミュレータを遅くするように強制する
- 9. リレーでフェッチを強制的に強制する方法
- 10. ドロップダウンリストのようにAndroidデータを読み込む方法
- 11. HttpsURLConnectionとHttpResponseCacheをAndroidで強制的にキャッシュする方法は?
- 12. ノンブロッキングの方法でテキスト行を読む
- 13. キーボードから完全なランダムなテキスト、フィルター、キャストを読む方法
- 14. 入力タイプ=テキストで絵文字キーボードを強制するには?
- 15. Windows環境でSystem.IO.Path.GetDirectoryName(文字列パス)を使用するように強制する方法
- 16. Onsen-ui:iOS端末でAndroidのルックアンドフィールを強制する方法は?
- 17. androidで英語のキーボードを強制する方法EditText
- 18. Android:強制的にソフトキーボードを強制終了するにはどうすればよいですか?
- 19. HTMLリンクを強制的に強制する方法は?
- 20. アスペクト比を強制的に強制する方法 - css
- 21. androidの文字列から文字を読み込む方法
- 22. サーバー/ドメイン全体でhttpsを強制的に使用する
- 23. Android Lintベースラインで相対パスを強制する方法
- 24. テキストを透明にして読む方法この例のように、
- 25. 文字列に特定のカルチャを強制する方法#
- 26. ウェブブラウザでテキストを開くようにExcelを強制するには?
- 27. TextBoxのテキストに強制値
- 28. ページ全体の高さを取るようにブートストラップ行を強制する
- 29. Pythonのテキストファイルからテキスト文字列を含む行全体を読む
- 30. Androidでプログラムでボイスメールを読む方法
まだ解決策がありましたか?もしそうなら、カメラアプリをリアルタイムで使用するのではなく、既存の画像で検出することができましたか? – DaveNOTDavid