[Vision API] Javaで画像のクロップヒントを検出する

Googleが提供しているVision APIをJavaで使ってみました。

APIを使用し、画像をクロップするヒント(座標)を取得します。
画像のクロップとは、中心のROI矩形領域のみの部分画像の切り出すことで
画像の最適化を行います。

記事では、APIの実行、その結果についてのみを記載していますので、
画像クロップや画像処理周りについて気になる方は検索してください。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Vision API] Javaで画像内のいろいろなものを検出する](https://qiita.com/doran/items/444cb6231b7dffb9ddac)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[Feature.Typeの指定](#1-featuretypeの指定)|
|2||[実行結果の取得](#2-実行結果の取得)|
||1|[レスポンスの出力](#21-レスポンスの出力)|
||2|[レスポンスの内容](#22-レスポンスの内容)|
|3||[結果の検証](#3-結果の検証)|
||1|[繁華街](#31-繁華街)|
||2|[交通標識](#32-交通標識)|
||3|[ボーリング](#33-ボーリング)|
||4|[人物](#34-人物)|
||5|[富士山](#35-富士山)|
||6|[熊本城](#36-熊本城)|
||7|[街](#37-街)|
||8|[野菜](#38-野菜)|
||9|[猫](#39-猫)|
||10|[デスク](#310-デスク)|
||11|[景色](#311-景色)|
||12|[駐車場](#312-駐車場)|

# 1. Feature.Typeの指定
クロップヒントを検出する場合は、
**Feature.Type.CROP_HINTS**
を指定します。

以下の記事でexecApi()にタイプを指定します。
[⧉[Vision API] Javaで画像内のいろいろなものを検出する](https://qiita.com/doran/items/444cb6231b7dffb9ddac#25-apiを呼び出す)

# 2. 実行結果の取得
### 2.1. レスポンスの出力
取得した結果をコンソールに出力します。
```
private static void output(BatchAnnotateImagesResponse response){
    List<AnnotateImageResponse> responses = response.getResponsesList();
    
    for (AnnotateImageResponse res : responses) {
        if (res.hasError()) {
            System.out.format("Error: %s%n", res.getError().getMessage());
            return;
        }

        CropHintsAnnotation annotation = res.getCropHintsAnnotation();
        for (CropHint hint : annotation.getCropHintsList()) {
            System.out.println(hint.getBoundingPoly());
        }
    }
}
```
### 2.2. レスポンスの内容
BatchAnnotateImagesResponseの
getResponsesListでAnnotateImageResponseリストが取得できます。
検出されなった場合は、空のリストが返ってきます。
#### AnnotateImageResponse
|メソッド|戻り値|内容|
|---|---|---|
|getCropHintsAnnotation|[CropHintsAnnotation](#crophintsannotation)|クロップを生成するために使用されるクロップ ヒントのセット|
#### CropHintsAnnotation
|メソッド|戻り値|内容|
|---|---|---|
|getCropHintsList|[CropHint](#crophint)|新しいクロップを生成するために使用されるクロップ ヒント|

#### CropHint
|メソッド|戻り値|内容|
|---|---|---|
|getConfidence|float|検出の信頼性。範囲は0〜1|
|getImportanceFraction|float|元の画像に対する重要度の割合|
|getBoundingPoly|[BoundingPoly](#boundingpoly)|クロップ領域の境界ポリゴン|

#### BoundingPoly
|メソッド|戻り値|内容|
|---|---|---|
|getVerticesList|List\<[Vertex](#vertex)\>|境界ポリゴンの頂点。<br>左上、右上、左下、右下の順|

#### Vertex
|メソッド|戻り値|内容|
|---|---|---|
|getX|int|X座標|
|getY|int|Y座標|

## 3. 結果の検証
いろいろな画像でクロップヒントを検出して画像クロップしてみました。

### 3.1. 繁華街
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/9b78a837-5b15-c8c4-d4f5-3bc3f69fb92e.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/ff21acc5-9e19-ab8b-1965-83376f154bc0.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.9735|0.9777777|(x:0,y:64)(x:1919,y:64)(x:1919,y:1148)(x:0,y:1148)|

### 3.2. 交通標識
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/9ae5caca-66b2-3d72-774e-e16f9c13b925.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/76988b67-dfb4-faf7-d68a-82b37bfe1208.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.59375|0.95999986|(x:185,y:0)(x:454,y:0)(x:454,y:479)(x:185,y:479)|

### 3.3. ボーリング
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/d7330b6f-ec07-4959-cff2-345e546dfceb.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/0c51aeb6-4ed4-2685-28b9-3a6664bc1b13.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.70232564|1.0|(x:0,y:32)(x:639,y:32)(x:639,y:394)(x:0,y:394)|

### 3.4. 人物
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/02b5422f-0c58-0856-6a64-3790c4977e6d.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/7bf6f282-0a9d-883e-0e56-97deea2877fc.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.588094|1.0|(x:192,y:0)(x:405,y:0)(x:405,y:381)(x:192,y:381)|

### 3.5. 富士山
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/d90434af-a665-a5f6-83e2-6f2e55e63fee.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/7550fc1c-90b5-3f29-7676-f687eb1f1ef4.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.6795335|1.0|(x:0,y:120)(x:639,y:120)(x:639,y:481)(x:0,y:481)|

### 3.6. 熊本城
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/8cec9b1f-1bd5-9cd5-1540-02b71c04bb0d.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/ce2b12cb-30d3-894d-031c-78f5a557bb34.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.9714276|0.97139585|(x:0,y:110)(x:639,y:110)(x:639,y:471)(x:0,y:471)|

### 3.7. 街
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/5c0cf874-28e4-9bb7-230d-16a49e28ddcb.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/00ad433c-b796-8490-07f7-53a2ca7a7448.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.73807615|1.0|(x:0,y:42)(x:639,y:42)(x:639,y:404)(x:0,y:404)|

### 3.8. 野菜
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e3180831-f3b2-0d46-3a15-d121c0d19555.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2f765c62-d59c-e273-e440-abbe43748085.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.875|0.82115394|(x:96,y:0)(x:523,y:0)(x:523,y:426)(x:96,y:426)|

### 3.9. 猫
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/61ee0313-6719-2de3-67d2-31711161a3a7.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/49257c7e-6a32-54e6-419f-e5c138b4d5a1.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.68750006|0.55999994|(x:96,y:0)(x:364,y:0)(x:364,y:479)(x:96,y:479)|

### 3.10. デスク
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/0e2fe664-5a6c-75cf-2250-ad80d7c9768e.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/f5cc136b-8ae0-e8eb-efa7-572a77d5ceda.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.9375|0.8609094|(x:0,y:0)(x:639,y:0)(x:639,y:361)(x:0,y:361)|

### 3.11. 景色
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/420636c2-9844-8211-8d4c-b50aa9bcc913.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/82ae77c6-e981-9b78-3d8a-6077c5a82bf1.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.5444824|1.0|(x:0,y:59)(x:639,y:59)(x:639,y:420)(x:0,y:420)|

### 3.12. 駐車場
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/081fa0e1-0766-39ac-b373-ef28abc526d2.jpeg">

**クロップ結果**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/d1f12fa9-bcc6-de5f-296b-ce751a19227e.jpeg">

|信頼性|重要度の割合|クロップヒント座標|
|---|---|---|
|0.7405825|1.0|(x:0,y:44)(x:639,y:44)(x:639,y:406)(x:0,y:406)|


<BR>
<BR>
おしまい。。。