/** * Copyright 2017, Google, Inc. * * <p>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 * * <p>http://www.apache.org/licenses/LICENSE-2.0 * * <p>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.vision; import com.google.cloud.vision.spi.v1.ImageAnnotatorClient; import com.google.cloud.vision.spi.v1.ImageAnnotatorSettings; import com.google.cloud.vision.v1.AnnotateImageRequest; import com.google.cloud.vision.v1.AnnotateImageResponse; import com.google.cloud.vision.v1.BatchAnnotateImagesResponse; import com.google.cloud.vision.v1.Block; import com.google.cloud.vision.v1.ColorInfo; import com.google.cloud.vision.v1.CropHint; import com.google.cloud.vision.v1.CropHintsAnnotation; import com.google.cloud.vision.v1.DominantColorsAnnotation; import com.google.cloud.vision.v1.EntityAnnotation; import com.google.cloud.vision.v1.FaceAnnotation; import com.google.cloud.vision.v1.Feature; import com.google.cloud.vision.v1.Feature.Type; import com.google.cloud.vision.v1.Image; import com.google.cloud.vision.v1.ImageSource; import com.google.cloud.vision.v1.LocationInfo; import com.google.cloud.vision.v1.Page; import com.google.cloud.vision.v1.Paragraph; import com.google.cloud.vision.v1.SafeSearchAnnotation; import com.google.cloud.vision.v1.Symbol; import com.google.cloud.vision.v1.TextAnnotation; import com.google.cloud.vision.v1.WebDetection; import com.google.cloud.vision.v1.WebDetection.WebEntity; import com.google.cloud.vision.v1.WebDetection.WebImage; import com.google.cloud.vision.v1.WebDetection.WebPage; import com.google.cloud.vision.v1.Word; import com.google.protobuf.ByteString; import org.threeten.bp.Duration; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; public class Detect { /** * Detects entities,sentiment and syntax in a document using the Natural Language API. * * @throws IOException on Input/Output errors. */ public static void main(String[] args) throws IOException { argsHelper(args, System.out); } /** * Helper that handles the input passed to the program. * * @throws IOException on Input/Output errors. */ public static void argsHelper(String[] args, PrintStream out) throws IOException { if (args.length < 1) { out.println("Usage:"); out.printf( "\tjava %s \"<command>\" \"<path-to-image>\"\n" + "Commands:\n" + "\tfaces | labels | landmarks | logos | text | safe-search | properties" + "| web | crop \n" + "Path:\n\tA file path (ex: ./resources/wakeupcat.jpg) or a URI for a Cloud Storage " + "resource (gs://...)\n", Detect.class.getCanonicalName()); return; } String command = args[0]; String path = args.length > 1 ? args[1] : ""; Detect app = new Detect(); if (command.equals("faces")) { if (path.startsWith("gs://")) { detectFacesGcs(path, out); } else { detectFaces(path, out); } } else if (command.equals("labels")) { if (path.startsWith("gs://")) { detectLabelsGcs(path, out); } else { detectLabels(path, out); } } else if (command.equals("landmarks")) { if (path.startsWith("http")) { detectLandmarksUrl(path, out); } else if (path.startsWith("gs://")) { detectLandmarksGcs(path, out); } else { detectLandmarks(path, out); } } else if (command.equals("logos")) { if (path.startsWith("gs://")) { detectLogosGcs(path, out); } else { detectLogos(path, out); } } else if (command.equals("text")) { if (path.startsWith("gs://")) { detectTextGcs(path, out); } else { detectText(path, out); } } else if (command.equals("properties")) { if (path.startsWith("gs://")) { detectPropertiesGcs(path, out); } else { detectProperties(path, out); } } else if (command.equals("safe-search")) { if (path.startsWith("gs://")) { detectSafeSearchGcs(path, out); } else { detectSafeSearch(path, out); } } else if (command.equals("web")) { if (path.startsWith("gs://")) { detectWebDetectionsGcs(path, out); } else { detectWebDetections(path, out); } } else if (command.equals("crop")) { if (path.startsWith("gs://")) { detectCropHintsGcs(path, out); } else { detectCropHints(path, out); } } else if (command.equals("fulltext")) { if (path.startsWith("gs://")) { detectDocumentTextGcs(path, out); } else { detectDocumentText(path, out); } } } /** * Constructs a {@link Detect} which connects to the Cloud Vision API. * * @param client The Vision API client. */ public Detect() { } /** * Detects faces in the specified local image. * * @param filePath The path to the file to perform face detection on. * @param out A {@link PrintStream} to write detected features to. * @throws IOException on Input/Output errors. */ public static void detectFaces(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.FACE_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (FaceAnnotation annotation : res.getFaceAnnotationsList()) { out.printf( "anger: %s\njoy: %s\nsurprise: %s\nposition: %s", annotation.getAngerLikelihood(), annotation.getJoyLikelihood(), annotation.getSurpriseLikelihood(), annotation.getBoundingPoly()); } } } /** * Detects faces in the specified remote image. * * @param gcsPath The path to the remote file to perform face detection on. * @param out A {@link PrintStream} to write detected features to. * @throws IOException on Input/Output errors. */ public static void detectFacesGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageAnnotatorSettings.Builder imageAnnotatorSettingsBuilder = ImageAnnotatorSettings.defaultBuilder(); imageAnnotatorSettingsBuilder .batchAnnotateImagesSettings() .getRetrySettingsBuilder() .setTotalTimeout(Duration.ofSeconds(30)); ImageAnnotatorSettings settings = imageAnnotatorSettingsBuilder.build(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.FACE_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); ImageAnnotatorClient client = ImageAnnotatorClient.create(settings); BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (FaceAnnotation annotation : res.getFaceAnnotationsList()) { out.printf( "anger: %s\njoy: %s\nsurprise: %s\nposition: %s", annotation.getAngerLikelihood(), annotation.getJoyLikelihood(), annotation.getSurpriseLikelihood(), annotation.getBoundingPoly()); } } } /** * Detects labels in the specified local image. * * @param filePath The path to the file to perform label detection on. * @param out A {@link PrintStream} to write detected labels to. * @throws IOException on Input/Output errors. */ public static void detectLabels(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.LABEL_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getLabelAnnotationsList()) { annotation.getAllFields().forEach((k, v) -> out.printf("%s : %s\n", k, v.toString())); } } } /** * Detects labels in the specified remote image. * * @param gcsPath The path to the remote file to perform label detection on. * @param out A {@link PrintStream} to write detected features to. * @throws IOException on Input/Output errors. */ public static void detectLabelsGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.LABEL_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getLabelAnnotationsList()) { annotation.getAllFields().forEach((k, v) -> out.printf("%s : %s\n", k, v.toString())); } } } /** * Detects landmarks in the specified local image. * * @param filePath The path to the file to perform landmark detection on. * @param out A {@link PrintStream} to write detected landmarks to. * @throws IOException on Input/Output errors. */ public static void detectLandmarks(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.LANDMARK_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getLandmarkAnnotationsList()) { LocationInfo info = annotation.getLocationsList().listIterator().next(); out.printf("Landmark: %s\n %s\n", annotation.getDescription(), info.getLatLng()); } } } /** * Detects landmarks in the specified URI. * * @param url The path to the file to perform landmark detection on. * @param out A {@link PrintStream} to write detected landmarks to. * @throws IOException on Input/Output errors. */ public static void detectLandmarksUrl(String url, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setImageUri(url).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.LANDMARK_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getLandmarkAnnotationsList()) { LocationInfo info = annotation.getLocationsList().listIterator().next(); out.printf("Landmark: %s\n %s\n", annotation.getDescription(), info.getLatLng()); } } } /** * Detects landmarks in the specified remote image. * * @param gcsPath The path to the remote file to perform landmark detection on. * @param out A {@link PrintStream} to write detected landmarks to. * @throws IOException on Input/Output errors. */ public static void detectLandmarksGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.LANDMARK_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getLandmarkAnnotationsList()) { LocationInfo info = annotation.getLocationsList().listIterator().next(); out.printf("Landmark: %s\n %s\n", annotation.getDescription(), info.getLatLng()); } } } /** * Detects logos in the specified local image. * * @param filePath The path to the local file to perform logo detection on. * @param out A {@link PrintStream} to write detected logos to. * @throws IOException on Input/Output errors. */ public static void detectLogos(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.LOGO_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getLogoAnnotationsList()) { out.println(annotation.getDescription()); } } } /** * Detects logos in the specified remote image. * * @param gcsPath The path to the remote file to perform logo detection on. * @param out A {@link PrintStream} to write detected logos to. * @throws IOException on Input/Output errors. */ public static void detectLogosGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.LOGO_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getLogoAnnotationsList()) { out.println(annotation.getDescription()); } } } /** * Detects text in the specified image. * * @param filePath The path to the file to detect text in. * @param out A {@link PrintStream} to write the detected text to. * @throws IOException on Input/Output errors. */ public static void detectText(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.TEXT_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getTextAnnotationsList()) { out.printf("Text: %s\n", annotation.getDescription()); out.printf("Position : %s\n", annotation.getBoundingPoly()); } } } /** * Detects text in the specified remote image. * * @param gcsPath The path to the remote file to detect text in. * @param out A {@link PrintStream} to write the detected text to. * @throws IOException on Input/Output errors. */ public static void detectTextGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.TEXT_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs for (EntityAnnotation annotation : res.getTextAnnotationsList()) { out.printf("Text: %s\n", annotation.getDescription()); out.printf("Position : %s\n", annotation.getBoundingPoly()); } } } /** * Detects image properties such as color frequency from the specified local image. * * @param filePath The path to the file to detect properties. * @param out A {@link PrintStream} to write * @throws IOException on Input/Output errors. */ public static void detectProperties(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.IMAGE_PROPERTIES).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs DominantColorsAnnotation colors = res.getImagePropertiesAnnotation().getDominantColors(); for (ColorInfo color : colors.getColorsList()) { out.printf( "fraction: %f\nr: %f, g: %f, b: %f\n", color.getPixelFraction(), color.getColor().getRed(), color.getColor().getGreen(), color.getColor().getBlue()); } } } /** * Detects image properties such as color frequency from the specified remote image. * * @param gcsPath The path to the remote file to detect properties on. * @param out A {@link PrintStream} to write * @throws IOException on Input/Output errors. */ public static void detectPropertiesGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.IMAGE_PROPERTIES).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs DominantColorsAnnotation colors = res.getImagePropertiesAnnotation().getDominantColors(); for (ColorInfo color : colors.getColorsList()) { out.printf( "fraction: %f\nr: %f, g: %f, b: %f\n", color.getPixelFraction(), color.getColor().getRed(), color.getColor().getGreen(), color.getColor().getBlue()); } } } /** * Detects whether the specified image has features you would want to moderate. * * @param filePath The path to the local file used for safe search detection. * @param out A {@link PrintStream} to write the results to. * @throws IOException on Input/Output errors. */ public static void detectSafeSearch(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.SAFE_SEARCH_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs SafeSearchAnnotation annotation = res.getSafeSearchAnnotation(); out.printf( "adult: %s\nmedical: %s\nspoofed: %s\nviolence: %s\n", annotation.getAdult(), annotation.getMedical(), annotation.getSpoof(), annotation.getViolence()); } } /** * Detects whether the specified remote image has features you would want to moderate. * * @param gcsPath The path to the remote file to detect safe-search on. * @param out A {@link PrintStream} to write the results to. * @throws IOException on Input/Output errors. */ public static void detectSafeSearchGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.SAFE_SEARCH_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs SafeSearchAnnotation annotation = res.getSafeSearchAnnotation(); out.printf( "adult: %s\nmedical: %s\nspoofed: %s\nviolence: %s\n", annotation.getAdult(), annotation.getMedical(), annotation.getSpoof(), annotation.getViolence()); } } /** * Finds references to the specified image on the web. * * @param filePath The path to the local file used for web annotation detection. * @param out A {@link PrintStream} to write the results to. * @throws IOException on Input/Output errors. */ public static void detectWebDetections(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.WEB_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // Search the web for usages of the image. You could use these signals later // for user input moderation or linking external references. // For a full list of available annotations, see http://g.co/cloud/vision/docs WebDetection annotation = res.getWebDetection(); out.println("Entity:Id:Score"); out.println("==============="); for (WebEntity entity : annotation.getWebEntitiesList()) { out.println(entity.getDescription() + " : " + entity.getEntityId() + " : " + entity.getScore()); } out.println("\nPages with matching images: Score\n=="); for (WebPage page : annotation.getPagesWithMatchingImagesList()) { out.println(page.getUrl() + " : " + page.getScore()); } out.println("\nPages with partially matching images: Score\n=="); for (WebImage image : annotation.getPartialMatchingImagesList()) { out.println(image.getUrl() + " : " + image.getScore()); } out.println("\nPages with fully matching images: Score\n=="); for (WebImage image : annotation.getFullMatchingImagesList()) { out.println(image.getUrl() + " : " + image.getScore()); } } } /** * Detects whether the specified remote image has features you would want to moderate. * * @param gcsPath The path to the remote file to detect safe-search on. * @param out A {@link PrintStream} to write the results to. * @throws IOException on Input/Output errors. */ public static void detectWebDetectionsGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.WEB_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // Search the web for usages of the image. You could use these signals later // for user input moderation or linking external references. // For a full list of available annotations, see http://g.co/cloud/vision/docs WebDetection annotation = res.getWebDetection(); out.println("Entity:Id:Score"); out.println("==============="); for (WebEntity entity : annotation.getWebEntitiesList()) { out.println(entity.getDescription() + " : " + entity.getEntityId() + " : " + entity.getScore()); } out.println("\nPages with matching images: Score\n=="); for (WebPage page : annotation.getPagesWithMatchingImagesList()) { out.println(page.getUrl() + " : " + page.getScore()); } out.println("\nPages with partially matching images: Score\n=="); for (WebImage image : annotation.getPartialMatchingImagesList()) { out.println(image.getUrl() + " : " + image.getScore()); } out.println("\nPages with fully matching images: Score\n=="); for (WebImage image : annotation.getFullMatchingImagesList()) { out.println(image.getUrl() + " : " + image.getScore()); } } } /** * Suggests a region to crop to for a local file. * * @param filePath The path to the local file used for web annotation detection. * @param out A {@link PrintStream} to write the results to. * @throws IOException on Input/Output errors. */ public static void detectCropHints(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.CROP_HINTS).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs CropHintsAnnotation annotation = res.getCropHintsAnnotation(); for (CropHint hint : annotation.getCropHintsList()) { out.println(hint.getBoundingPoly()); } } } /** * Suggests a region to crop to for a remote file. * * @param gcsPath The path to the remote file to detect safe-search on. * @param out A {@link PrintStream} to write the results to. * @throws IOException on Input/Output errors. */ public static void detectCropHintsGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.CROP_HINTS).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs CropHintsAnnotation annotation = res.getCropHintsAnnotation(); for (CropHint hint : annotation.getCropHintsList()) { out.println(hint.getBoundingPoly()); } } } /** * Performs document text detection on a local image file. * * @param filePath The path to the local file to detect document text on. * @param out A {@link PrintStream} to write the results to. * @throws IOException on Input/Output errors. */ public static void detectDocumentText(String filePath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ByteString imgBytes = ByteString.readFrom(new FileInputStream(filePath)); Image img = Image.newBuilder().setContent(imgBytes).build(); Feature feat = Feature.newBuilder().setType(Type.DOCUMENT_TEXT_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs TextAnnotation annotation = res.getFullTextAnnotation(); for (Page page: annotation.getPagesList()) { String pageText = ""; for (Block block : page.getBlocksList()) { String blockText = ""; for (Paragraph para : block.getParagraphsList()) { String paraText = ""; for (Word word: para.getWordsList()) { String wordText = ""; for (Symbol symbol: word.getSymbolsList()) { wordText = wordText + symbol.getText(); } paraText = paraText + wordText; } // Output Example using Paragraph: out.println("Paragraph: \n" + paraText); out.println("Bounds: \n" + para.getBoundingBox() + "\n"); blockText = blockText + paraText; } pageText = pageText + blockText; } } out.println(annotation.getText()); } } /** * Performs document text detection on a local image file. * * @param gcsPath The path to the remote file to detect document text on. * @param out A {@link PrintStream} to write the results to. * @throws IOException on Input/Output errors. */ public static void detectDocumentTextGcs(String gcsPath, PrintStream out) throws IOException { List<AnnotateImageRequest> requests = new ArrayList<>(); ImageSource imgSource = ImageSource.newBuilder().setGcsImageUri(gcsPath).build(); Image img = Image.newBuilder().setSource(imgSource).build(); Feature feat = Feature.newBuilder().setType(Type.DOCUMENT_TEXT_DETECTION).build(); AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); requests.add(request); BatchAnnotateImagesResponse response = ImageAnnotatorClient.create().batchAnnotateImages(requests); List<AnnotateImageResponse> responses = response.getResponsesList(); for (AnnotateImageResponse res : responses) { if (res.hasError()) { out.printf("Error: %s\n", res.getError().getMessage()); return; } // For full list of available annotations, see http://g.co/cloud/vision/docs TextAnnotation annotation = res.getFullTextAnnotation(); for (Page page: annotation.getPagesList()) { String pageText = ""; for (Block block : page.getBlocksList()) { String blockText = ""; for (Paragraph para : block.getParagraphsList()) { String paraText = ""; for (Word word: para.getWordsList()) { String wordText = ""; for (Symbol symbol: word.getSymbolsList()) { wordText = wordText + symbol.getText(); } paraText = paraText + wordText; } // Output Example using Paragraph: out.println("Paragraph: \n" + paraText); out.println("Bounds: \n" + para.getBoundingBox() + "\n"); blockText = blockText + paraText; } pageText = pageText + blockText; } } out.println(annotation.getText()); } } }