/* * Copyright 2016, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.androidthings.doorbell; import android.util.Log; import com.google.api.client.extensions.android.http.AndroidHttp; import com.google.api.client.http.HttpTransport; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.vision.v1.Vision; import com.google.api.services.vision.v1.VisionRequestInitializer; import com.google.api.services.vision.v1.model.AnnotateImageRequest; import com.google.api.services.vision.v1.model.BatchAnnotateImagesRequest; import com.google.api.services.vision.v1.model.BatchAnnotateImagesResponse; import com.google.api.services.vision.v1.model.EntityAnnotation; import com.google.api.services.vision.v1.model.Feature; import com.google.api.services.vision.v1.model.Image; import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class CloudVisionUtils { public static final String TAG = CloudVisionUtils.class.getSimpleName(); private static final String CLOUD_VISION_API_KEY = "<ENTER VISION API KEY>"; private static final String LABEL_DETECTION = "LABEL_DETECTION"; private static final int MAX_LABEL_RESULTS = 10; /** * Construct an annotated image request for the provided image to be executed * using the provided API interface. * * @param imageBytes image bytes in JPEG format. * @return collection of annotation descriptions and scores. */ public static Map<String, Float> annotateImage(byte[] imageBytes) throws IOException { // Construct the Vision API instance HttpTransport httpTransport = AndroidHttp.newCompatibleTransport(); JsonFactory jsonFactory = GsonFactory.getDefaultInstance(); VisionRequestInitializer initializer = new VisionRequestInitializer(CLOUD_VISION_API_KEY); Vision vision = new Vision.Builder(httpTransport, jsonFactory, null) .setVisionRequestInitializer(initializer) .build(); // Create the image request AnnotateImageRequest imageRequest = new AnnotateImageRequest(); Image img = new Image(); img.encodeContent(imageBytes); imageRequest.setImage(img); // Add the features we want Feature labelDetection = new Feature(); labelDetection.setType(LABEL_DETECTION); labelDetection.setMaxResults(MAX_LABEL_RESULTS); imageRequest.setFeatures(Collections.singletonList(labelDetection)); // Batch and execute the request BatchAnnotateImagesRequest requestBatch = new BatchAnnotateImagesRequest(); requestBatch.setRequests(Collections.singletonList(imageRequest)); BatchAnnotateImagesResponse response = vision.images() .annotate(requestBatch) // Due to a bug: requests to Vision API containing large images fail when GZipped. .setDisableGZipContent(true) .execute(); return convertResponseToMap(response); } /** * Process an encoded image and return a collection of vision * annotations describing features of the image data. * * @return collection of annotation descriptions and scores. */ private static Map<String, Float> convertResponseToMap(BatchAnnotateImagesResponse response) { // Convert response into a readable collection of annotations Map<String, Float> annotations = new HashMap<>(); List<EntityAnnotation> labels = response.getResponses().get(0).getLabelAnnotations(); if (labels != null) { for (EntityAnnotation label : labels) { annotations.put(label.getDescription(), label.getScore()); } } Log.d(TAG, "Cloud Vision request completed:" + annotations); return annotations; } }