google-cloud-vision 0.31.0 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +2 -9
- data/LICENSE +1 -1
- data/README.md +94 -0
- data/lib/google/cloud/vision.rb +200 -535
- data/lib/google/cloud/vision/v1.rb +129 -55
- data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/image_annotator.rb +9 -0
- data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/product_search.rb +88 -0
- data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/product_search_service.rb +539 -0
- data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/text_annotation.rb +3 -3
- data/lib/google/cloud/vision/v1/doc/google/cloud/vision/v1/web_detection.rb +2 -1
- data/lib/google/cloud/vision/{version.rb → v1/doc/google/protobuf/empty.rb} +13 -6
- data/lib/google/cloud/vision/v1/doc/google/protobuf/field_mask.rb +230 -0
- data/lib/google/cloud/vision/v1/doc/google/protobuf/timestamp.rb +109 -0
- data/lib/google/cloud/vision/v1/geometry_pb.rb +1 -0
- data/lib/google/cloud/vision/v1/helpers.rb +972 -0
- data/lib/google/cloud/vision/v1/image_annotator_client.rb +4 -4
- data/lib/google/cloud/vision/v1/image_annotator_pb.rb +5 -0
- data/lib/google/cloud/vision/v1/image_annotator_services_pb.rb +2 -1
- data/lib/google/cloud/vision/v1/product_search_client.rb +1337 -0
- data/lib/google/cloud/vision/v1/product_search_client_config.json +116 -0
- data/lib/google/cloud/vision/v1/product_search_pb.rb +45 -0
- data/lib/google/cloud/vision/v1/product_search_service_pb.rb +191 -0
- data/lib/google/cloud/vision/v1/product_search_service_services_pb.rb +224 -0
- data/lib/google/cloud/vision/v1p3beta1.rb +233 -0
- data/lib/google/cloud/vision/v1p3beta1/credentials.rb +42 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/geometry.rb +72 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/image_annotator.rb +763 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/product_search.rb +154 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/product_search_service.rb +533 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/text_annotation.rb +254 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/cloud/vision/v1p3beta1/web_detection.rb +101 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/longrunning/operations.rb +93 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/any.rb +130 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/empty.rb +29 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/field_mask.rb +230 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/timestamp.rb +109 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/protobuf/wrappers.rb +90 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/rpc/status.rb +84 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/type/color.rb +156 -0
- data/lib/google/cloud/vision/v1p3beta1/doc/google/type/latlng.rb +65 -0
- data/lib/google/cloud/vision/v1p3beta1/geometry_pb.rb +43 -0
- data/lib/google/cloud/vision/v1p3beta1/helpers.rb +972 -0
- data/lib/google/cloud/vision/v1p3beta1/image_annotator_client.rb +302 -0
- data/lib/google/cloud/vision/v1p3beta1/image_annotator_client_config.json +36 -0
- data/lib/google/cloud/vision/v1p3beta1/image_annotator_pb.rb +304 -0
- data/lib/google/cloud/vision/v1p3beta1/image_annotator_services_pb.rb +55 -0
- data/lib/google/cloud/vision/v1p3beta1/product_search_client.rb +1351 -0
- data/lib/google/cloud/vision/v1p3beta1/product_search_client_config.json +116 -0
- data/lib/google/cloud/vision/v1p3beta1/product_search_pb.rb +64 -0
- data/lib/google/cloud/vision/v1p3beta1/product_search_service_pb.rb +191 -0
- data/lib/google/cloud/vision/v1p3beta1/product_search_service_services_pb.rb +222 -0
- data/lib/google/cloud/vision/v1p3beta1/text_annotation_pb.rb +94 -0
- data/lib/google/cloud/vision/v1p3beta1/web_detection_pb.rb +51 -0
- metadata +53 -122
- data/AUTHENTICATION.md +0 -179
- data/CHANGELOG.md +0 -109
- data/CODE_OF_CONDUCT.md +0 -40
- data/CONTRIBUTING.md +0 -188
- data/LOGGING.md +0 -32
- data/OVERVIEW.md +0 -202
- data/TROUBLESHOOTING.md +0 -37
- data/lib/google-cloud-vision.rb +0 -146
- data/lib/google/cloud/vision/annotate.rb +0 -303
- data/lib/google/cloud/vision/annotation.rb +0 -553
- data/lib/google/cloud/vision/annotation/crop_hint.rb +0 -126
- data/lib/google/cloud/vision/annotation/entity.rb +0 -225
- data/lib/google/cloud/vision/annotation/face.rb +0 -1497
- data/lib/google/cloud/vision/annotation/normalized_vertex.rb +0 -76
- data/lib/google/cloud/vision/annotation/object_localization.rb +0 -115
- data/lib/google/cloud/vision/annotation/properties.rb +0 -220
- data/lib/google/cloud/vision/annotation/safe_search.rb +0 -153
- data/lib/google/cloud/vision/annotation/text.rb +0 -1015
- data/lib/google/cloud/vision/annotation/vertex.rb +0 -91
- data/lib/google/cloud/vision/annotation/web.rb +0 -420
- data/lib/google/cloud/vision/credentials.rb +0 -57
- data/lib/google/cloud/vision/image.rb +0 -832
- data/lib/google/cloud/vision/location.rb +0 -98
- data/lib/google/cloud/vision/project.rb +0 -367
- data/lib/google/cloud/vision/service.rb +0 -83
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# Copyright 2016 Google LLC
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
require "googleauth"
|
|
17
|
-
|
|
18
|
-
module Google
|
|
19
|
-
module Cloud
|
|
20
|
-
module Vision
|
|
21
|
-
##
|
|
22
|
-
# # Credentials
|
|
23
|
-
#
|
|
24
|
-
# Represents the authentication and authorization used to connect to the
|
|
25
|
-
# Vision API.
|
|
26
|
-
#
|
|
27
|
-
# @example
|
|
28
|
-
# require "google/cloud/vision"
|
|
29
|
-
#
|
|
30
|
-
# keyfile = "/path/to/keyfile.json"
|
|
31
|
-
# creds = Google::Cloud::Vision::Credentials.new keyfile
|
|
32
|
-
#
|
|
33
|
-
# vision = Google::Cloud::Vision.new(
|
|
34
|
-
# project_id: "my-project",
|
|
35
|
-
# credentials: creds
|
|
36
|
-
# )
|
|
37
|
-
#
|
|
38
|
-
# vision.project_id #=> "my-project"
|
|
39
|
-
#
|
|
40
|
-
class Credentials < Google::Auth::Credentials
|
|
41
|
-
SCOPE = ["https://www.googleapis.com/auth/cloud-platform"].freeze
|
|
42
|
-
PATH_ENV_VARS = %w[VISION_CREDENTIALS
|
|
43
|
-
VISION_KEYFILE
|
|
44
|
-
GOOGLE_CLOUD_CREDENTIALS
|
|
45
|
-
GOOGLE_CLOUD_KEYFILE
|
|
46
|
-
GCLOUD_KEYFILE].freeze
|
|
47
|
-
JSON_ENV_VARS = %w[VISION_CREDENTIALS_JSON
|
|
48
|
-
VISION_KEYFILE_JSON
|
|
49
|
-
GOOGLE_CLOUD_CREDENTIALS_JSON
|
|
50
|
-
GOOGLE_CLOUD_KEYFILE_JSON
|
|
51
|
-
GCLOUD_KEYFILE_JSON].freeze
|
|
52
|
-
DEFAULT_PATHS = \
|
|
53
|
-
["~/.config/gcloud/application_default_credentials.json"].freeze
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
@@ -1,832 +0,0 @@
|
|
|
1
|
-
# Copyright 2016 Google LLC
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
require "google/cloud/vision/location"
|
|
17
|
-
require "stringio"
|
|
18
|
-
require "base64"
|
|
19
|
-
|
|
20
|
-
module Google
|
|
21
|
-
module Cloud
|
|
22
|
-
module Vision
|
|
23
|
-
##
|
|
24
|
-
# # Image
|
|
25
|
-
#
|
|
26
|
-
# Represents an image for the Vision service.
|
|
27
|
-
#
|
|
28
|
-
# An Image instance can be created from a string file path, publicly-
|
|
29
|
-
# accessible image HTTP/HTTPS URL, or Cloud Storage URI of the form
|
|
30
|
-
# `"gs://bucketname/path/to/image_filename"`; or a File, IO, StringIO, or
|
|
31
|
-
# Tempfile instance; or an instance of Google::Cloud::Storage::File.
|
|
32
|
-
#
|
|
33
|
-
# See {Project#image}.
|
|
34
|
-
#
|
|
35
|
-
# The Cloud Vision API supports a variety of image file formats, including
|
|
36
|
-
# JPEG, PNG8, PNG24, Animated GIF (first frame only), and RAW. See [Best
|
|
37
|
-
# Practices - Image
|
|
38
|
-
# Types](https://cloud.google.com/vision/docs/best-practices#image_types)
|
|
39
|
-
# for the list of formats. Be aware that Cloud Vision sets upper limits on
|
|
40
|
-
# file size as well as the total combined size of all images in a request.
|
|
41
|
-
# Reducing your file size can significantly improve throughput; however,
|
|
42
|
-
# be careful not to reduce image quality in the process. See [Best
|
|
43
|
-
# Practices - Image
|
|
44
|
-
# Sizing](https://cloud.google.com/vision/docs/best-practices#image_sizing)
|
|
45
|
-
# for current file size limits.
|
|
46
|
-
#
|
|
47
|
-
# @see https://cloud.google.com/vision/docs/best-practices Best
|
|
48
|
-
# Practices
|
|
49
|
-
#
|
|
50
|
-
# @example
|
|
51
|
-
# require "google/cloud/vision"
|
|
52
|
-
#
|
|
53
|
-
# vision = Google::Cloud::Vision.new
|
|
54
|
-
#
|
|
55
|
-
# image = vision.image "path/to/text.png"
|
|
56
|
-
#
|
|
57
|
-
# image.context.languages = ["en"]
|
|
58
|
-
#
|
|
59
|
-
# text = image.text
|
|
60
|
-
# text.pages.count #=> 1
|
|
61
|
-
#
|
|
62
|
-
class Image
|
|
63
|
-
# Returns the image context for the image, which accepts metadata values
|
|
64
|
-
# such as location and language hints.
|
|
65
|
-
# @return [Context] The context instance for the image.
|
|
66
|
-
attr_reader :context
|
|
67
|
-
|
|
68
|
-
##
|
|
69
|
-
# @private Creates a new Image instance.
|
|
70
|
-
def initialize
|
|
71
|
-
@io = nil
|
|
72
|
-
@url = nil
|
|
73
|
-
@vision = nil
|
|
74
|
-
@context = Context.new
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
##
|
|
78
|
-
# @private Whether the Image has content.
|
|
79
|
-
#
|
|
80
|
-
def io?
|
|
81
|
-
!@io.nil?
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
##
|
|
85
|
-
# @private Whether the Image is a URL.
|
|
86
|
-
#
|
|
87
|
-
def url?
|
|
88
|
-
!@url.nil?
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
##
|
|
92
|
-
# Performs the `FACE_DETECTION` feature on the image.
|
|
93
|
-
#
|
|
94
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
95
|
-
#
|
|
96
|
-
# @param [Integer] max_results The maximum number of results. The
|
|
97
|
-
# default is {Google::Cloud::Vision.default_max_faces}. Optional.
|
|
98
|
-
#
|
|
99
|
-
# @return [Array<Annotation::Face>] The results of face detection.
|
|
100
|
-
#
|
|
101
|
-
# @example
|
|
102
|
-
# require "google/cloud/vision"
|
|
103
|
-
#
|
|
104
|
-
# vision = Google::Cloud::Vision.new
|
|
105
|
-
# image = vision.image "path/to/face.jpg"
|
|
106
|
-
#
|
|
107
|
-
# faces = image.faces
|
|
108
|
-
#
|
|
109
|
-
# face = faces.first
|
|
110
|
-
# face.bounds.face.count #=> 4
|
|
111
|
-
# vertex = face.bounds.face.first
|
|
112
|
-
# vertex.x #=> 28
|
|
113
|
-
# vertex.y #=> 40
|
|
114
|
-
#
|
|
115
|
-
def faces max_results = Vision.default_max_faces
|
|
116
|
-
ensure_vision!
|
|
117
|
-
annotation = @vision.mark self, faces: max_results
|
|
118
|
-
annotation.faces
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
##
|
|
122
|
-
# Performs the `FACE_DETECTION` feature on the image and returns only
|
|
123
|
-
# the first result.
|
|
124
|
-
#
|
|
125
|
-
# @return [Annotation::Face] The first result of face detection.
|
|
126
|
-
#
|
|
127
|
-
def face
|
|
128
|
-
faces(1).first
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
##
|
|
132
|
-
# Performs the `LANDMARK_DETECTION` feature on the image.
|
|
133
|
-
#
|
|
134
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
135
|
-
#
|
|
136
|
-
# @param [Integer] max_results The maximum number of results. The
|
|
137
|
-
# default is {Google::Cloud::Vision.default_max_landmarks}. Optional.
|
|
138
|
-
#
|
|
139
|
-
# @return [Array<Annotation::Entity>] The results of landmark detection.
|
|
140
|
-
#
|
|
141
|
-
# @example
|
|
142
|
-
# require "google/cloud/vision"
|
|
143
|
-
#
|
|
144
|
-
# vision = Google::Cloud::Vision.new
|
|
145
|
-
# image = vision.image "path/to/landmark.jpg"
|
|
146
|
-
#
|
|
147
|
-
# landmarks = image.landmarks
|
|
148
|
-
#
|
|
149
|
-
# landmark = landmarks.first
|
|
150
|
-
# landmark.score #=> 0.9191226363182068
|
|
151
|
-
# landmark.description #=> "Mount Rushmore"
|
|
152
|
-
# landmark.mid #=> "/m/019dvv"
|
|
153
|
-
#
|
|
154
|
-
def landmarks max_results = Vision.default_max_landmarks
|
|
155
|
-
ensure_vision!
|
|
156
|
-
annotation = @vision.mark self, landmarks: max_results
|
|
157
|
-
annotation.landmarks
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
##
|
|
161
|
-
# Performs the `LANDMARK_DETECTION` feature on the image and returns
|
|
162
|
-
# only the first result.
|
|
163
|
-
#
|
|
164
|
-
# @return [Annotation::Entity] The first result of landmark detection.
|
|
165
|
-
#
|
|
166
|
-
def landmark
|
|
167
|
-
landmarks(1).first
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
##
|
|
171
|
-
# Performs the `LOGO_DETECTION` feature on the image.
|
|
172
|
-
#
|
|
173
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
174
|
-
#
|
|
175
|
-
# @param [Integer] max_results The maximum number of results. The
|
|
176
|
-
# default is {Google::Cloud::Vision.default_max_logos}. Optional.
|
|
177
|
-
#
|
|
178
|
-
# @return [Array<Annotation::Entity>] The results of logo detection.
|
|
179
|
-
#
|
|
180
|
-
# @example
|
|
181
|
-
# require "google/cloud/vision"
|
|
182
|
-
#
|
|
183
|
-
# vision = Google::Cloud::Vision.new
|
|
184
|
-
# image = vision.image "path/to/logo.jpg"
|
|
185
|
-
#
|
|
186
|
-
# logos = image.logos
|
|
187
|
-
#
|
|
188
|
-
# logo = logos.first
|
|
189
|
-
# logo.score #=> 0.7005731463432312
|
|
190
|
-
# logo.description #=> "Google"
|
|
191
|
-
# logo.mid #=> "/m/0b34hf"
|
|
192
|
-
#
|
|
193
|
-
def logos max_results = Vision.default_max_logos
|
|
194
|
-
ensure_vision!
|
|
195
|
-
annotation = @vision.mark self, logos: max_results
|
|
196
|
-
annotation.logos
|
|
197
|
-
end
|
|
198
|
-
|
|
199
|
-
##
|
|
200
|
-
# Performs the `LOGO_DETECTION` feature on the image and returns only
|
|
201
|
-
# the first result.
|
|
202
|
-
#
|
|
203
|
-
# @return [Annotation::Entity] The first result of logo detection.
|
|
204
|
-
#
|
|
205
|
-
def logo
|
|
206
|
-
logos(1).first
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
##
|
|
210
|
-
# Performs the `LABEL_DETECTION` feature on the image.
|
|
211
|
-
#
|
|
212
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
213
|
-
#
|
|
214
|
-
# @param [Integer] max_results The maximum number of results. The
|
|
215
|
-
# default is {Google::Cloud::Vision.default_max_labels}. Optional.
|
|
216
|
-
#
|
|
217
|
-
# @return [Array<Annotation::Entity>] The results of label detection.
|
|
218
|
-
#
|
|
219
|
-
# @example
|
|
220
|
-
# require "google/cloud/vision"
|
|
221
|
-
#
|
|
222
|
-
# vision = Google::Cloud::Vision.new
|
|
223
|
-
# image = vision.image "path/to/landmark.jpg"
|
|
224
|
-
#
|
|
225
|
-
# labels = image.labels
|
|
226
|
-
#
|
|
227
|
-
# labels.count #=> 4
|
|
228
|
-
# label = labels.first
|
|
229
|
-
# label.score #=> 0.9481348991394043
|
|
230
|
-
# label.description #=> "stone carving"
|
|
231
|
-
# label.mid #=> "/m/02wtjj"
|
|
232
|
-
#
|
|
233
|
-
def labels max_results = Vision.default_max_labels
|
|
234
|
-
ensure_vision!
|
|
235
|
-
annotation = @vision.mark self, labels: max_results
|
|
236
|
-
annotation.labels
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
##
|
|
240
|
-
# Performs the `LABEL_DETECTION` feature on the image and returns only
|
|
241
|
-
# the first result.
|
|
242
|
-
#
|
|
243
|
-
# @return [Annotation::Entity] The first result of label detection.
|
|
244
|
-
#
|
|
245
|
-
def label
|
|
246
|
-
labels(1).first
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
##
|
|
250
|
-
# Performs the `TEXT_DETECTION` feature (OCR for shorter documents with
|
|
251
|
-
# sparse text) on the image.
|
|
252
|
-
#
|
|
253
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
254
|
-
#
|
|
255
|
-
# @return [Annotation::Text] The results of text (OCR) detection.
|
|
256
|
-
#
|
|
257
|
-
# @example
|
|
258
|
-
# require "google/cloud/vision"
|
|
259
|
-
#
|
|
260
|
-
# vision = Google::Cloud::Vision.new
|
|
261
|
-
# image = vision.image "path/to/text.png"
|
|
262
|
-
#
|
|
263
|
-
# text = image.text
|
|
264
|
-
#
|
|
265
|
-
# text.text
|
|
266
|
-
# # "Google Cloud Client for Ruby an idiomatic, intuitive... "
|
|
267
|
-
#
|
|
268
|
-
# text.locale #=> "en"
|
|
269
|
-
# text.words.count #=> 28
|
|
270
|
-
# text.words[0].text #=> "Google"
|
|
271
|
-
# text.words[0].bounds.count #=> 4
|
|
272
|
-
# vertex = text.words[0].bounds.first
|
|
273
|
-
# vertex.x #=> 13
|
|
274
|
-
# vertex.y #=> 8
|
|
275
|
-
#
|
|
276
|
-
# # Use `pages` to access a full structural representation
|
|
277
|
-
# page = text.pages.first
|
|
278
|
-
# page.blocks[0].paragraphs[0].words[0].symbols[0].text #=> "G"
|
|
279
|
-
#
|
|
280
|
-
#
|
|
281
|
-
def text
|
|
282
|
-
ensure_vision!
|
|
283
|
-
annotation = @vision.mark self, text: true
|
|
284
|
-
annotation.text
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
##
|
|
288
|
-
# Performs the `DOCUMENT_TEXT_DETECTION` feature (OCR for longer
|
|
289
|
-
# documents with dense text) on the image.
|
|
290
|
-
#
|
|
291
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
292
|
-
#
|
|
293
|
-
# @return [Annotation::Text] The results of document text (OCR)
|
|
294
|
-
# detection.
|
|
295
|
-
#
|
|
296
|
-
# @example
|
|
297
|
-
# require "google/cloud/vision"
|
|
298
|
-
#
|
|
299
|
-
# vision = Google::Cloud::Vision.new
|
|
300
|
-
# image = vision.image "path/to/text.png"
|
|
301
|
-
#
|
|
302
|
-
# text = image.document
|
|
303
|
-
#
|
|
304
|
-
# text.text
|
|
305
|
-
# # "Google Cloud Client for Ruby an idiomatic, intuitive... "
|
|
306
|
-
#
|
|
307
|
-
# text.words[0].text #=> "Google"
|
|
308
|
-
# text.words[0].bounds.count #=> 4
|
|
309
|
-
# vertex = text.words[0].bounds.first
|
|
310
|
-
# vertex.x #=> 13
|
|
311
|
-
# vertex.y #=> 8
|
|
312
|
-
#
|
|
313
|
-
# # Use `pages` to access a full structural representation
|
|
314
|
-
# page = text.pages.first
|
|
315
|
-
# page.blocks[0].paragraphs[0].words[0].symbols[0].text #=> "G"
|
|
316
|
-
#
|
|
317
|
-
def document
|
|
318
|
-
ensure_vision!
|
|
319
|
-
annotation = @vision.mark self, document: true
|
|
320
|
-
annotation.text
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
##
|
|
324
|
-
# Performs the `SAFE_SEARCH_DETECTION` feature on the image.
|
|
325
|
-
#
|
|
326
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
327
|
-
#
|
|
328
|
-
# @return [Annotation::SafeSearch] The results of safe search detection.
|
|
329
|
-
#
|
|
330
|
-
# @example
|
|
331
|
-
# require "google/cloud/vision"
|
|
332
|
-
#
|
|
333
|
-
# vision = Google::Cloud::Vision.new
|
|
334
|
-
# image = vision.image "path/to/face.jpg"
|
|
335
|
-
#
|
|
336
|
-
# safe_search = image.safe_search
|
|
337
|
-
#
|
|
338
|
-
# safe_search.spoof? #=> false
|
|
339
|
-
# safe_search.spoof #=> :VERY_UNLIKELY
|
|
340
|
-
#
|
|
341
|
-
def safe_search
|
|
342
|
-
ensure_vision!
|
|
343
|
-
annotation = @vision.mark self, safe_search: true
|
|
344
|
-
annotation.safe_search
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
##
|
|
348
|
-
# Performs the `IMAGE_PROPERTIES` feature on the image.
|
|
349
|
-
#
|
|
350
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
351
|
-
#
|
|
352
|
-
# @return [Annotation::Properties] The results of image properties
|
|
353
|
-
# detection.
|
|
354
|
-
#
|
|
355
|
-
# @example
|
|
356
|
-
# require "google/cloud/vision"
|
|
357
|
-
#
|
|
358
|
-
# vision = Google::Cloud::Vision.new
|
|
359
|
-
# image = vision.image "path/to/logo.jpg"
|
|
360
|
-
#
|
|
361
|
-
# properties = image.properties
|
|
362
|
-
#
|
|
363
|
-
# properties.colors.count #=> 10
|
|
364
|
-
# color = properties.colors.first
|
|
365
|
-
# color.red #=> 247.0
|
|
366
|
-
# color.green #=> 236.0
|
|
367
|
-
# color.blue #=> 20.0
|
|
368
|
-
#
|
|
369
|
-
def properties
|
|
370
|
-
ensure_vision!
|
|
371
|
-
annotation = @vision.mark self, properties: true
|
|
372
|
-
annotation.properties
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
##
|
|
376
|
-
# Performs the `CROP_HINTS` feature on the image.
|
|
377
|
-
#
|
|
378
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
379
|
-
#
|
|
380
|
-
# @return [Array<Annotation::CropHint>] The results of crop hints
|
|
381
|
-
# detection.
|
|
382
|
-
#
|
|
383
|
-
# @example
|
|
384
|
-
# require "google/cloud/vision"
|
|
385
|
-
#
|
|
386
|
-
# vision = Google::Cloud::Vision.new
|
|
387
|
-
# image = vision.image "path/to/face.jpg"
|
|
388
|
-
#
|
|
389
|
-
# crop_hints = image.crop_hints
|
|
390
|
-
# crop_hints.count #=> 1
|
|
391
|
-
# crop_hint = crop_hints.first
|
|
392
|
-
#
|
|
393
|
-
# crop_hint.bounds.count #=> 4
|
|
394
|
-
# crop_hint.confidence #=> 1.0
|
|
395
|
-
# crop_hint.importance_fraction #=> 1.0399999618530273
|
|
396
|
-
#
|
|
397
|
-
def crop_hints max_results = Vision.default_max_crop_hints
|
|
398
|
-
ensure_vision!
|
|
399
|
-
annotation = @vision.mark self, crop_hints: max_results
|
|
400
|
-
annotation.crop_hints
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
##
|
|
404
|
-
# Performs the `WEB_ANNOTATION` feature on the image.
|
|
405
|
-
#
|
|
406
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
407
|
-
#
|
|
408
|
-
# @return [Annotation::Web] The results of web detection.
|
|
409
|
-
#
|
|
410
|
-
# @example
|
|
411
|
-
# require "google/cloud/vision"
|
|
412
|
-
#
|
|
413
|
-
# vision = Google::Cloud::Vision.new
|
|
414
|
-
# image = vision.image "path/to/face.jpg"
|
|
415
|
-
#
|
|
416
|
-
# web = image.web
|
|
417
|
-
#
|
|
418
|
-
# entity = web.entities.first
|
|
419
|
-
# entity.entity_id #=> "/m/019dvv"
|
|
420
|
-
# entity.score #=> 107.34591674804688
|
|
421
|
-
# entity.description #=> "Mount Rushmore National Memorial"
|
|
422
|
-
#
|
|
423
|
-
# full_matching_image = web.full_matching_images.first
|
|
424
|
-
# full_matching_image.url #=> "http://example.com/images/123.jpg"
|
|
425
|
-
# full_matching_image.score #=> 0.10226666927337646
|
|
426
|
-
#
|
|
427
|
-
# page_with_matching_images = web.pages_with_matching_images.first
|
|
428
|
-
# page_with_matching_images.url #=> "http://example.com/posts/123"
|
|
429
|
-
# page_with_matching_images.score #=> 8.114753723144531
|
|
430
|
-
#
|
|
431
|
-
def web max_results = Vision.default_max_web
|
|
432
|
-
ensure_vision!
|
|
433
|
-
annotation = @vision.mark self, web: max_results
|
|
434
|
-
annotation.web
|
|
435
|
-
end
|
|
436
|
-
|
|
437
|
-
##
|
|
438
|
-
# Performs the `OBJECT_LOCALIZATION` feature on the image.
|
|
439
|
-
#
|
|
440
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
441
|
-
#
|
|
442
|
-
# @return [Array<Annotation::ObjectLocalization>] The results of object
|
|
443
|
-
# localizations detection.
|
|
444
|
-
#
|
|
445
|
-
# @example
|
|
446
|
-
# require "google/cloud/vision"
|
|
447
|
-
#
|
|
448
|
-
# vision = Google::Cloud::Vision.new
|
|
449
|
-
# image = vision.image "path/to/bicycle.jpg"
|
|
450
|
-
#
|
|
451
|
-
# object_localizations = image.object_localizations
|
|
452
|
-
# object_localizations.count #=> 6
|
|
453
|
-
# object_localization = object_localizations.first
|
|
454
|
-
#
|
|
455
|
-
# object_localization.name #=> "Bicycle wheel"
|
|
456
|
-
# object_localization.bounds.count #=> 4
|
|
457
|
-
#
|
|
458
|
-
def object_localizations max_results = \
|
|
459
|
-
Vision.default_max_object_localizations
|
|
460
|
-
ensure_vision!
|
|
461
|
-
annotation = @vision.mark self, object_localizations: max_results
|
|
462
|
-
annotation.object_localizations
|
|
463
|
-
end
|
|
464
|
-
|
|
465
|
-
##
|
|
466
|
-
# Performs detection of Cloud Vision
|
|
467
|
-
# [features](https://cloud.google.com/vision/reference/rest/v1/images/annotate#Feature)
|
|
468
|
-
# on the image. If no options for features are provided, **all** image
|
|
469
|
-
# detection features will be performed, with a default of `100` results
|
|
470
|
-
# for faces, landmarks, logos, labels, crop_hints, and web. If any
|
|
471
|
-
# feature option is provided, only the specified feature detections will
|
|
472
|
-
# be performed. Please review
|
|
473
|
-
# [Pricing](https://cloud.google.com/vision/docs/pricing) before use, as
|
|
474
|
-
# a separate charge is incurred for each feature performed on an image.
|
|
475
|
-
#
|
|
476
|
-
# @see https://cloud.google.com/vision/docs/requests-and-responses Cloud
|
|
477
|
-
# Vision API Requests and Responses
|
|
478
|
-
# @see https://cloud.google.com/vision/reference/rest/v1/images/annotate#AnnotateImageRequest
|
|
479
|
-
# AnnotateImageRequest
|
|
480
|
-
# @see https://cloud.google.com/vision/docs/pricing Cloud Vision Pricing
|
|
481
|
-
#
|
|
482
|
-
# @param [Boolean, Integer] faces Whether to perform the facial
|
|
483
|
-
# detection feature. The maximum number of results is configured in
|
|
484
|
-
# {Google::Cloud::Vision.default_max_faces}, or may be provided here.
|
|
485
|
-
# Optional.
|
|
486
|
-
# @param [Boolean, Integer] landmarks Whether to perform the landmark
|
|
487
|
-
# detection feature. The maximum number of results is configured in
|
|
488
|
-
# {Google::Cloud::Vision.default_max_landmarks}, or may be provided
|
|
489
|
-
# here. Optional.
|
|
490
|
-
# @param [Boolean, Integer] logos Whether to perform the logo detection
|
|
491
|
-
# feature. The maximum number of results is configured in
|
|
492
|
-
# {Google::Cloud::Vision.default_max_logos}, or may be provided here.
|
|
493
|
-
# Optional.
|
|
494
|
-
# @param [Boolean, Integer] labels Whether to perform the label
|
|
495
|
-
# detection feature. The maximum number of results is configured in
|
|
496
|
-
# {Google::Cloud::Vision.default_max_labels}, or may be provided here.
|
|
497
|
-
# Optional.
|
|
498
|
-
# @param [Boolean] text Whether to perform the text detection feature
|
|
499
|
-
# (OCR for shorter documents with sparse text). Optional.
|
|
500
|
-
# @param [Boolean] document Whether to perform the document text
|
|
501
|
-
# detection feature (OCR for longer documents with dense text).
|
|
502
|
-
# Optional.
|
|
503
|
-
# @param [Boolean] safe_search Whether to perform the safe search
|
|
504
|
-
# feature. Optional.
|
|
505
|
-
# @param [Boolean] properties Whether to perform the image properties
|
|
506
|
-
# feature (currently, the image's dominant colors.) Optional.
|
|
507
|
-
# @param [Boolean, Integer] crop_hints Whether to perform the crop hints
|
|
508
|
-
# feature. Optional.
|
|
509
|
-
# @param [Boolean, Integer] web Whether to perform the web annotation
|
|
510
|
-
# feature. Optional.
|
|
511
|
-
# @param [Boolean, Integer] object_localizations Whether to perform the
|
|
512
|
-
# object localizations feature. Optional.
|
|
513
|
-
#
|
|
514
|
-
# @return [Annotation] The results for all image detections, returned as
|
|
515
|
-
# a single {Annotation} instance.
|
|
516
|
-
#
|
|
517
|
-
# @example
|
|
518
|
-
# require "google/cloud/vision"
|
|
519
|
-
#
|
|
520
|
-
# vision = Google::Cloud::Vision.new
|
|
521
|
-
#
|
|
522
|
-
# image = vision.image "path/to/landmark.jpg"
|
|
523
|
-
#
|
|
524
|
-
# annotation = image.annotate labels: true, landmarks: true
|
|
525
|
-
#
|
|
526
|
-
# annotation.labels.map &:description
|
|
527
|
-
# # ["stone carving", "ancient history", "statue", "sculpture",
|
|
528
|
-
# # "monument", "landmark"]
|
|
529
|
-
# annotation.landmarks.count #=> 1
|
|
530
|
-
#
|
|
531
|
-
# @example Maximum result values can also be provided:
|
|
532
|
-
# require "google/cloud/vision"
|
|
533
|
-
#
|
|
534
|
-
# vision = Google::Cloud::Vision.new
|
|
535
|
-
#
|
|
536
|
-
# image = vision.image "path/to/landmark.jpg"
|
|
537
|
-
#
|
|
538
|
-
# annotation = image.annotate labels: 3, landmarks: 3
|
|
539
|
-
#
|
|
540
|
-
# annotation.labels.map &:description
|
|
541
|
-
# # ["stone carving", "ancient history", "statue"]
|
|
542
|
-
# annotation.landmarks.count #=> 1
|
|
543
|
-
#
|
|
544
|
-
def annotate faces: false, landmarks: false, logos: false,
|
|
545
|
-
labels: false, text: false, document: false,
|
|
546
|
-
safe_search: false, properties: false, crop_hints: false,
|
|
547
|
-
web: false, object_localizations: false
|
|
548
|
-
@vision.annotate(self, faces: faces, landmarks: landmarks,
|
|
549
|
-
logos: logos, labels: labels, text: text,
|
|
550
|
-
document: document, safe_search: safe_search,
|
|
551
|
-
properties: properties, crop_hints: crop_hints,
|
|
552
|
-
web: web,
|
|
553
|
-
object_localizations: object_localizations)
|
|
554
|
-
end
|
|
555
|
-
alias mark annotate
|
|
556
|
-
alias detect annotate
|
|
557
|
-
|
|
558
|
-
# @private
|
|
559
|
-
def to_s
|
|
560
|
-
@to_s ||= begin
|
|
561
|
-
if io?
|
|
562
|
-
@io.rewind
|
|
563
|
-
"(#{@io.read(16)}...)"
|
|
564
|
-
else
|
|
565
|
-
"(#{@url})"
|
|
566
|
-
end
|
|
567
|
-
end
|
|
568
|
-
end
|
|
569
|
-
|
|
570
|
-
# @private
|
|
571
|
-
def inspect
|
|
572
|
-
"#<#{self.class.name} #{self}>"
|
|
573
|
-
end
|
|
574
|
-
|
|
575
|
-
##
|
|
576
|
-
# @private The GRPC object for the Image.
|
|
577
|
-
def to_grpc
|
|
578
|
-
if io?
|
|
579
|
-
@io.rewind
|
|
580
|
-
Google::Cloud::Vision::V1::Image.new content: @io.read
|
|
581
|
-
elsif url?
|
|
582
|
-
Google::Cloud::Vision::V1::Image.new(
|
|
583
|
-
source: Google::Cloud::Vision::V1::ImageSource.new(
|
|
584
|
-
image_uri: @url
|
|
585
|
-
)
|
|
586
|
-
)
|
|
587
|
-
else
|
|
588
|
-
raise ArgumentError, "Unable to use Image with Vision service."
|
|
589
|
-
end
|
|
590
|
-
end
|
|
591
|
-
|
|
592
|
-
##
|
|
593
|
-
# @private New Image from a source object.
|
|
594
|
-
def self.from_source source, vision = nil
|
|
595
|
-
if source.respond_to?(:read) && source.respond_to?(:rewind)
|
|
596
|
-
return from_io(source, vision)
|
|
597
|
-
end
|
|
598
|
-
# Convert Storage::File objects to the URL
|
|
599
|
-
source = source.to_gs_url if source.respond_to? :to_gs_url
|
|
600
|
-
# Everything should be a string from now on
|
|
601
|
-
source = String source
|
|
602
|
-
# Create an Image from a HTTP/HTTPS URL or Google Storage URL.
|
|
603
|
-
return from_url(source, vision) if url? source
|
|
604
|
-
# Create an image from a file on the filesystem
|
|
605
|
-
if File.file? source
|
|
606
|
-
unless File.readable? source
|
|
607
|
-
raise ArgumentError, "Cannot read #{source}"
|
|
608
|
-
end
|
|
609
|
-
return from_io(File.open(source, "rb"), vision)
|
|
610
|
-
end
|
|
611
|
-
raise ArgumentError, "Unable to convert #{source} to an Image"
|
|
612
|
-
end
|
|
613
|
-
|
|
614
|
-
##
|
|
615
|
-
# @private New Image from an IO object.
|
|
616
|
-
def self.from_io io, vision
|
|
617
|
-
if !io.respond_to?(:read) && !io.respond_to?(:rewind)
|
|
618
|
-
raise ArgumentError, "Cannot create an Image without an IO object"
|
|
619
|
-
end
|
|
620
|
-
new.tap do |i|
|
|
621
|
-
i.instance_variable_set :@io, io
|
|
622
|
-
i.instance_variable_set :@vision, vision
|
|
623
|
-
end
|
|
624
|
-
end
|
|
625
|
-
|
|
626
|
-
##
|
|
627
|
-
# @private New Image from a HTTP/HTTPS URL or Google Storage URL.
|
|
628
|
-
def self.from_url url, vision
|
|
629
|
-
url = String url
|
|
630
|
-
unless url? url
|
|
631
|
-
raise ArgumentError, "Cannot create an Image without a URL"
|
|
632
|
-
end
|
|
633
|
-
new.tap do |i|
|
|
634
|
-
i.instance_variable_set :@url, url
|
|
635
|
-
i.instance_variable_set :@vision, vision
|
|
636
|
-
end
|
|
637
|
-
end
|
|
638
|
-
|
|
639
|
-
##
|
|
640
|
-
# @private
|
|
641
|
-
def self.url? url
|
|
642
|
-
regex = %r{\A(http|https|gs):\/\/}
|
|
643
|
-
!regex.match(url).nil?
|
|
644
|
-
end
|
|
645
|
-
|
|
646
|
-
protected
|
|
647
|
-
|
|
648
|
-
##
|
|
649
|
-
# Raise an error unless an active vision project object is available.
|
|
650
|
-
def ensure_vision!
|
|
651
|
-
raise "Must have active connection" unless @vision
|
|
652
|
-
end
|
|
653
|
-
end
|
|
654
|
-
|
|
655
|
-
class Image
|
|
656
|
-
##
|
|
657
|
-
# # Image::Context
|
|
658
|
-
#
|
|
659
|
-
# Represents an image context.
|
|
660
|
-
#
|
|
661
|
-
# @attr [Array<String>] languages A list of [ISO 639-1 language
|
|
662
|
-
# codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)
|
|
663
|
-
# to use for text (OCR) detection. In most cases, an empty value
|
|
664
|
-
# will yield the best results as it will allow text detection to
|
|
665
|
-
# automatically detect the text language. For languages based on the
|
|
666
|
-
# latin alphabet a hint is not needed. In rare cases, when the
|
|
667
|
-
# language of the text in the image is known in advance, setting
|
|
668
|
-
# this hint will help get better results (although it will hurt a
|
|
669
|
-
# great deal if the hint is wrong). For use with {Image#text}.
|
|
670
|
-
# @attr [Array<Float>] aspect_ratios Aspect ratios in floats,
|
|
671
|
-
# representing the ratio of the width to the height of the image. For
|
|
672
|
-
# example, if the desired aspect ratio is 4/3, the corresponding float
|
|
673
|
-
# value should be 1.33333. If not specified, the best possible crop
|
|
674
|
-
# is returned. The number of provided aspect ratios is limited to a
|
|
675
|
-
# maximum of 16; any aspect ratios provided after the 16th are
|
|
676
|
-
# ignored. For use with {Image#crop_hints}.
|
|
677
|
-
#
|
|
678
|
-
# @example
|
|
679
|
-
# require "google/cloud/vision"
|
|
680
|
-
#
|
|
681
|
-
# vision = Google::Cloud::Vision.new
|
|
682
|
-
#
|
|
683
|
-
# image = vision.image "path/to/landmark.jpg"
|
|
684
|
-
# image.context.area.min = { longitude: -122.0862462,
|
|
685
|
-
# latitude: 37.4220041 }
|
|
686
|
-
# image.context.area.max = { longitude: -122.0762462,
|
|
687
|
-
# latitude: 37.4320041 }
|
|
688
|
-
#
|
|
689
|
-
class Context
|
|
690
|
-
##
|
|
691
|
-
# Returns a lat/long rectangle that specifies the location of the
|
|
692
|
-
# image.
|
|
693
|
-
# @return [Area] The lat/long pairs for `latLongRect`.
|
|
694
|
-
attr_reader :area
|
|
695
|
-
|
|
696
|
-
attr_accessor :languages, :aspect_ratios
|
|
697
|
-
|
|
698
|
-
##
|
|
699
|
-
# @private Creates a new Context instance.
|
|
700
|
-
def initialize
|
|
701
|
-
@area = Area.new
|
|
702
|
-
@languages = []
|
|
703
|
-
@aspect_ratios = []
|
|
704
|
-
end
|
|
705
|
-
|
|
706
|
-
##
|
|
707
|
-
# Returns `true` if either `min` or `max` are not populated.
|
|
708
|
-
#
|
|
709
|
-
# @return [Boolean]
|
|
710
|
-
#
|
|
711
|
-
def empty?
|
|
712
|
-
area.empty? && languages.empty? && aspect_ratios.empty?
|
|
713
|
-
end
|
|
714
|
-
|
|
715
|
-
##
|
|
716
|
-
# @private
|
|
717
|
-
def to_grpc
|
|
718
|
-
return nil if empty?
|
|
719
|
-
|
|
720
|
-
args = {}
|
|
721
|
-
args[:lat_long_rect] = area.to_grpc unless area.empty?
|
|
722
|
-
args[:language_hints] = languages unless languages.empty?
|
|
723
|
-
unless aspect_ratios.empty?
|
|
724
|
-
crop_params = Google::Cloud::Vision::V1::CropHintsParams.new(
|
|
725
|
-
aspect_ratios: aspect_ratios
|
|
726
|
-
)
|
|
727
|
-
args[:crop_hints_params] = crop_params
|
|
728
|
-
end
|
|
729
|
-
Google::Cloud::Vision::V1::ImageContext.new args
|
|
730
|
-
end
|
|
731
|
-
|
|
732
|
-
##
|
|
733
|
-
# # Image::Context::Area
|
|
734
|
-
#
|
|
735
|
-
# A Lat/long rectangle that specifies the location of the image.
|
|
736
|
-
#
|
|
737
|
-
# @example
|
|
738
|
-
# require "google/cloud/vision"
|
|
739
|
-
#
|
|
740
|
-
# vision = Google::Cloud::Vision.new
|
|
741
|
-
#
|
|
742
|
-
# image = vision.image "path/to/landmark.jpg"
|
|
743
|
-
#
|
|
744
|
-
# image.context.area.min = { longitude: -122.0862462,
|
|
745
|
-
# latitude: 37.4220041 }
|
|
746
|
-
# image.context.area.max = { longitude: -122.0762462,
|
|
747
|
-
# latitude: 37.4320041 }
|
|
748
|
-
#
|
|
749
|
-
# entity = image.landmark
|
|
750
|
-
#
|
|
751
|
-
class Area
|
|
752
|
-
# Returns the min lat/long pair.
|
|
753
|
-
# @return [Location]
|
|
754
|
-
attr_reader :min
|
|
755
|
-
|
|
756
|
-
# Returns the max lat/long pair.
|
|
757
|
-
# @return [Location]
|
|
758
|
-
attr_reader :max
|
|
759
|
-
|
|
760
|
-
##
|
|
761
|
-
# @private Creates a new Area instance.
|
|
762
|
-
def initialize
|
|
763
|
-
@min = Location.new nil, nil
|
|
764
|
-
@max = Location.new nil, nil
|
|
765
|
-
end
|
|
766
|
-
|
|
767
|
-
##
|
|
768
|
-
# Sets the min lat/long pair for the area.
|
|
769
|
-
#
|
|
770
|
-
# @param [Hash(Symbol => Float)] location A Hash containing the keys
|
|
771
|
-
# `:latitude` and `:longitude` with corresponding values
|
|
772
|
-
# conforming to the [WGS84
|
|
773
|
-
# standard](http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf).
|
|
774
|
-
def min= location
|
|
775
|
-
if location.respond_to?(:to_h) &&
|
|
776
|
-
location.to_h.keys.sort == %i[latitude longitude]
|
|
777
|
-
@min = Location.new(location.to_h[:latitude],
|
|
778
|
-
location.to_h[:longitude])
|
|
779
|
-
return
|
|
780
|
-
end
|
|
781
|
-
raise ArgumentError, "Must pass a proper location value."
|
|
782
|
-
end
|
|
783
|
-
|
|
784
|
-
##
|
|
785
|
-
# Sets the max lat/long pair for the area.
|
|
786
|
-
#
|
|
787
|
-
# @param [Hash(Symbol => Float)] location A Hash containing the keys
|
|
788
|
-
# `:latitude` and `:longitude` with corresponding values
|
|
789
|
-
# conforming to the [WGS84
|
|
790
|
-
# standard](http://www.unoosa.org/pdf/icg/2012/template/WGS_84.pdf).
|
|
791
|
-
def max= location
|
|
792
|
-
if location.respond_to?(:to_h) &&
|
|
793
|
-
location.to_h.keys.sort == %i[latitude longitude]
|
|
794
|
-
@max = Location.new(location.to_h[:latitude],
|
|
795
|
-
location.to_h[:longitude])
|
|
796
|
-
return
|
|
797
|
-
end
|
|
798
|
-
raise ArgumentError, "Must pass a proper location value."
|
|
799
|
-
end
|
|
800
|
-
|
|
801
|
-
##
|
|
802
|
-
# Returns `true` if either `min` or `max` are not populated.
|
|
803
|
-
#
|
|
804
|
-
# @return [Boolean]
|
|
805
|
-
#
|
|
806
|
-
def empty?
|
|
807
|
-
min.to_h.values.reject(&:nil?).empty? ||
|
|
808
|
-
max.to_h.values.reject(&:nil?).empty?
|
|
809
|
-
end
|
|
810
|
-
|
|
811
|
-
##
|
|
812
|
-
# Deeply converts object to a hash. All keys will be symbolized.
|
|
813
|
-
#
|
|
814
|
-
# @return [Hash]
|
|
815
|
-
#
|
|
816
|
-
def to_h
|
|
817
|
-
{ min_lat_lng: min.to_h, max_lat_lng: max.to_h }
|
|
818
|
-
end
|
|
819
|
-
|
|
820
|
-
def to_grpc
|
|
821
|
-
return nil if empty?
|
|
822
|
-
Google::Cloud::Vision::V1::LatLongRect.new(
|
|
823
|
-
min_lat_lng: min.to_grpc,
|
|
824
|
-
max_lat_lng: max.to_grpc
|
|
825
|
-
)
|
|
826
|
-
end
|
|
827
|
-
end
|
|
828
|
-
end
|
|
829
|
-
end
|
|
830
|
-
end
|
|
831
|
-
end
|
|
832
|
-
end
|