質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

814閲覧

GCP Vision API を活用した画像認識の方法について

jabberwocky3376

総合スコア14

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

2クリップ

投稿2019/07/17 07:33

やりたいこと

Android開発2ヶ月の初心者です。
現在、GCPのVision APIを活用して画像認識を行い、画像から抽出したテキストの内、
必要な部分だけを抜き出してそれを表示するページを作成しようと考えています。

カメラで撮影した画像を認識し、テキストを取り出すという動きを考えています。
Vision APIのサンプルコードほぼそのままで、テキストの認識と抽出は行うことができたのですが、
抽出したテキストから、必要な部分だけを取り出す方法と整形する方法がわからず難儀しています。
以下は現時点で画像から抽出したテキストです。
イメージ説明

この画像で抽出しているテキストを整形し、以下のような形で別ページにて表示させたいと考えています。

「今回メータ支持数:3060」 「前回メーター支持数:3029」

行き詰まっている部分

写真の撮影を行い、その画像のJSONデータを利用すれば、条件付けして任意のテキストを表示で切るかと思ったのですが、
まずAndroidでJsonを受け取ってそれを加工する方法がわかりません。
Gsonなどを使ってパースする?ような方法を調べましたが、非常に難しく悩んでおります。
Jsonデータを利用せずとも、何か他の方法(例えば、カメラ自体の枠を小さくする、など)でできそうであればご教授いただければ幸いです。

以下はMainActivity.javaのコードです。
外部APIを使うのもなにぶん初めてですので、理解が遅かったりおかしなことをしている部分が多々あるかと思いますが、
宜しくお願い致します。

MainActivity

1 2 @Override 3 public void onRequestPermissionsResult( 4 int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 5 super.onRequestPermissionsResult(requestCode, permissions, grantResults); 6 switch (requestCode) { 7 case CAMERA_PERMISSIONS_REQUEST: 8 if (PermissionUtils.permissionGranted(requestCode, CAMERA_PERMISSIONS_REQUEST, grantResults)) { 9 startCamera(); 10 } 11 break; 12 case GALLERY_PERMISSIONS_REQUEST: 13 if (PermissionUtils.permissionGranted(requestCode, GALLERY_PERMISSIONS_REQUEST, grantResults)) { 14 startGalleryChooser(); 15 } 16 break; 17 } 18 } 19 20 public void uploadImage(Uri uri) { 21 if (uri != null) { 22 try { 23 // scale the image to save on bandwidth 24 Bitmap bitmap = 25 scaleBitmapDown( 26 MediaStore.Images.Media.getBitmap(getContentResolver(), uri), 27 MAX_DIMENSION); 28 29 callCloudVision(bitmap); 30 mMainImage.setImageBitmap(bitmap); 31 32 } catch (IOException e) { 33 Log.d(TAG, "Image picking failed because " + e.getMessage()); 34 Toast.makeText(this, R.string.image_picker_error, Toast.LENGTH_LONG).show(); 35 } 36 } else { 37 Log.d(TAG, "Image picker gave us a null image."); 38 Toast.makeText(this, R.string.image_picker_error, Toast.LENGTH_LONG).show(); 39 } 40 } 41 42 private Vision.Images.Annotate prepareAnnotationRequest(Bitmap bitmap) throws IOException { 43 HttpTransport httpTransport = AndroidHttp.newCompatibleTransport(); 44 JsonFactory jsonFactory = GsonFactory.getDefaultInstance(); 45 46 VisionRequestInitializer requestInitializer = 47 new VisionRequestInitializer(CLOUD_VISION_API_KEY) { 48 /** 49 * We override this so we can inject important identifying fields into the HTTP 50 * headers. This enables use of a restricted cloud platform API key. 51 */ 52 @Override 53 protected void initializeVisionRequest(VisionRequest<?> visionRequest) 54 throws IOException { 55 super.initializeVisionRequest(visionRequest); 56 57 String packageName = getPackageName(); 58 visionRequest.getRequestHeaders().set(ANDROID_PACKAGE_HEADER, packageName); 59 60 String sig = PackageManagerUtils.getSignature(getPackageManager(), packageName); 61 62 visionRequest.getRequestHeaders().set(ANDROID_CERT_HEADER, sig); 63 } 64 }; 65 66 Vision.Builder builder = new Vision.Builder(httpTransport, jsonFactory, null); 67 builder.setVisionRequestInitializer(requestInitializer); 68 69 Vision vision = builder.build(); 70 71 BatchAnnotateImagesRequest batchAnnotateImagesRequest = 72 new BatchAnnotateImagesRequest(); 73 batchAnnotateImagesRequest.setRequests(new ArrayList<AnnotateImageRequest>() {{ 74 AnnotateImageRequest annotateImageRequest = new AnnotateImageRequest(); 75 76 // Add the image 77 Image base64EncodedImage = new Image(); 78 // Convert the bitmap to a JPEG 79 // Just in case it's a format that Android understands but Cloud Vision 80 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 81 bitmap.compress(Bitmap.CompressFormat.JPEG, 90, byteArrayOutputStream); 82 byte[] imageBytes = byteArrayOutputStream.toByteArray(); 83 84 // Base64 encode the JPEG 85 base64EncodedImage.encodeContent(imageBytes); 86 annotateImageRequest.setImage(base64EncodedImage); 87 88 // add the features we want 89 annotateImageRequest.setFeatures(new ArrayList<Feature>() {{ 90 Feature labelDetection = new Feature(); 91 labelDetection.setType("TEXT_DETECTION"); 92 labelDetection.setMaxResults(MAX_LABEL_RESULTS); 93 add(labelDetection); 94 }}); 95 96 // Add the list of one thing to the request 97 add(annotateImageRequest); 98 }}); 99 100 Vision.Images.Annotate annotateRequest = 101 vision.images().annotate(batchAnnotateImagesRequest); 102 // Due to a bug: requests to Vision API containing large images fail when GZipped. 103 annotateRequest.setDisableGZipContent(true); 104 Log.d(TAG, "created Cloud Vision request object, sending request"); 105 106 return annotateRequest; 107 } 108 109 private static class LableDetectionTask extends AsyncTask<Object, Void, String> { 110 private final WeakReference<MainActivity> mActivityWeakReference; 111 private Vision.Images.Annotate mRequest; 112 113 LableDetectionTask(MainActivity activity, Vision.Images.Annotate annotate) { 114 mActivityWeakReference = new WeakReference<>(activity); 115 mRequest = annotate; 116 } 117 118 @Override 119 protected String doInBackground(Object... params) { 120 try { 121 Log.d(TAG, "created Cloud Vision request object, sending request"); 122 BatchAnnotateImagesResponse response = mRequest.execute(); 123 return convertResponseToString(response); 124 125 } catch (GoogleJsonResponseException e) { 126 Log.d(TAG, "failed to make API request because " + e.getContent()); 127 } catch (IOException e) { 128 Log.d(TAG, "failed to make API request because of other IOException " + 129 e.getMessage()); 130 } 131 return "Cloud Vision API request failed. Check logs for details."; 132 } 133 134 protected void onPostExecute(String result) { 135 MainActivity activity = mActivityWeakReference.get(); 136 if (activity != null && !activity.isFinishing()) { 137 TextView imageDetail = activity.findViewById(R.id.image_details); 138 imageDetail.setText(result); 139 } 140 } 141 } 142 143 private void callCloudVision(final Bitmap bitmap) { 144 // Switch text to loading 145 mImageDetails.setText(R.string.loading_message); 146 147 // Do the real work in an async task, because we need to use the network anyway 148 try { 149 AsyncTask<Object, Void, String> labelDetectionTask = new LableDetectionTask(this, prepareAnnotationRequest(bitmap)); 150 labelDetectionTask.execute(); 151 } catch (IOException e) { 152 Log.d(TAG, "failed to make API request because of other IOException " + 153 e.getMessage()); 154 } 155 } 156 private static String convertResponseToString(BatchAnnotateImagesResponse response) { 157 StringBuilder message = new StringBuilder(""); 158 159 TextAnnotation label = response.getResponses().get(0).getFullTextAnnotation(); 160 if (label != null) { 161 message.append(label.getText()); 162 } else { 163 message.append("nothing"); 164 } 165 return message.toString(); 166 } 167

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

BatchAnnotateImagesResponse というクラスは、JSON形式のレスポンスをすでにJavaオブジェクトにマッピングしたもののようですので、Gsonなどをかませる必要はなくそのまま利用すればOKです。

ドキュメントによると、 getTextAnnotations()というメソッドを使えば検出された文字列の一覧にアクセスできそうです。あとは文字列の内容や位置などの情報を使って目的の情報に絞り込めばよいと思います。

投稿2019/07/17 11:59

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問