Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions lib/mindee/geometry/polygon.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ module Mindee
module Geometry
# Contains any number of vertex coordinates (Points).
class Polygon < Array
# @param server_response [Hash] Raw server response hash.
def initialize(server_response)
points = []
server_response.map do |point|
points << Point.new(point[0], point[1])
end
super(points)
end

# Get the central point (centroid) of the polygon.
# @return [Mindee::Geometry::Point]
def centroid
Expand Down
15 changes: 1 addition & 14 deletions lib/mindee/geometry/utils.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,6 @@ def self.quadrilateral_from_prediction(prediction)
)
end

# Transform a prediction into a Polygon.
# @param prediction [Hash]
# @return [Mindee::Geometry::Polygon]
def self.polygon_from_prediction(prediction)
polygon = Polygon.new
return polygon if prediction.nil?

prediction.each do |point|
polygon << Point.new(point[0], point[1])
end
polygon
end

# Gets the points of a bounding box for a given set of points
# @param vertices [Array<Mindee::Geometry::Point>]
# @return [Array<Float>]
Expand All @@ -39,7 +26,7 @@ def self.get_bbox(vertices)
[x_coords.min, y_coords.min, x_coords.max, y_coords.max]
end

# Creates the bounding bounding box for a given set of points
# Creates the bounding box for a given set of points
# @param vertices [Array<Mindee::Geometry::Point>]
# @return [Mindee::Geometry::Quadrilateral]
def self.get_bounding_box(vertices)
Expand Down
2 changes: 1 addition & 1 deletion lib/mindee/parsing/common/ocr/ocr.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class OCRWord
def initialize(prediction)
@text = prediction['text']
@confidence = prediction['confidence']
@polygon = Geometry.polygon_from_prediction(prediction['polygon'])
@polygon = Mindee::Geometry::Polygon.new(prediction['polygon'])
@bounding_box = Geometry.get_bounding_box(@polygon) unless @polygon.nil? || @polygon.empty?
end

Expand Down
2 changes: 1 addition & 1 deletion lib/mindee/parsing/standard/abstract_field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class AbstractField
# @param page_id [Integer, nil]
def initialize(prediction, page_id)
@confidence = prediction['confidence'] if prediction.key?('confidence')
@polygon = Geometry.polygon_from_prediction(prediction['polygon']) if prediction.key?('polygon')
@polygon = Mindee::Geometry::Polygon.new(prediction['polygon']) if prediction.key?('polygon')
@bounding_box = Geometry.get_bounding_box(@polygon) unless @polygon.nil? || @polygon.empty?
@page_id = page_id || prediction['page_id']
end
Expand Down
2 changes: 1 addition & 1 deletion lib/mindee/parsing/standard/position_field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class PositionField
# @param page_id [Integer, nil]
def initialize(prediction, page_id)
unless prediction['polygon'].nil? || prediction['polygon'].empty?
@polygon = Geometry.polygon_from_prediction(prediction['polygon'])
@polygon = Mindee::Geometry::Polygon.new(prediction['polygon'])
end
@quadrangle = to_quadrilateral(prediction, 'quadrangle')
@rectangle = to_quadrilateral(prediction, 'rectangle')
Expand Down
7 changes: 2 additions & 5 deletions lib/mindee/parsing/v2/field/field_location.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,8 @@ class FieldLocation

# @param server_response [Hash] Raw server response hash.
def initialize(server_response)
polygon_data = server_response['polygon'] || server_response[:polygon]
@polygon = polygon_data ? Mindee::Geometry::Polygon.new(polygon_data) : nil

page_id = server_response['page'] || server_response[:page]
@page = page_id.is_a?(Float) || page_id.is_a?(Integer) ? page_id.to_i : nil
@polygon = Mindee::Geometry::Polygon.new(server_response['polygon'])
@page = server_response['page']
end

# String representation of the polygon (empty string when none).
Expand Down
1 change: 1 addition & 0 deletions sig/mindee/geometry/polygon.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
module Mindee
module Geometry
class Polygon < Array[Point]
def initialize: (Array[::Mindee::Geometry::Point | Array[Float]]) -> void
def centroid: -> Point
def point_in_y?: (Point) -> bool
end
Expand Down
4 changes: 2 additions & 2 deletions sig/mindee/parsing/v2/field/field_location.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ module Mindee
module V2
module Field
class FieldLocation
attr_reader page: Integer?
attr_reader polygon: Geometry::Polygon?
attr_reader page: Integer
attr_reader polygon: Geometry::Polygon

def initialize: (Hash[String | Symbol, untyped]) -> void
def to_s: -> String
Expand Down
22 changes: 13 additions & 9 deletions spec/parsing/v2/inference_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -308,19 +308,23 @@ def load_standard_fields
expect(date_field.locations[0].page).to eq(0)

polygon = date_field.locations[0].polygon
expect(polygon[0].length).to eq(2)
expect(polygon[0]).to be_a(Mindee::Geometry::Point)

expect(polygon[0][0]).to be_within(1e-12).of(0.948979073166918)
expect(polygon[0][1]).to be_within(1e-12).of(0.23097924535067715)
expect(polygon[0].x).to eq(0.948979073166918)
expect(polygon[0].y).to eq(0.23097924535067715)

expect(polygon[1][0]).to be_within(1e-12).of(0.85422)
expect(polygon[1][1]).to be_within(1e-12).of(0.230072)
expect(polygon[1][0]).to eq(0.85422)
expect(polygon[1][1]).to eq(0.230072)

expect(polygon[2][0]).to be_within(1e-12).of(0.8540899268330819)
expect(polygon[2][1]).to be_within(1e-12).of(0.24365775464932288)
expect(polygon[2][0]).to eq(0.8540899268330819)
expect(polygon[2][1]).to eq(0.24365775464932288)

expect(polygon[3][0]).to be_within(1e-12).of(0.948849)
expect(polygon[3][1]).to be_within(1e-12).of(0.244565)
expect(polygon[3][0]).to eq(0.948849)
expect(polygon[3][1]).to eq(0.244565)

centroid = polygon.centroid
expect(centroid.x).to eq(0.9015345)
expect(centroid.y).to eq(0.23731850000000002)

confidence = date_field.confidence
expect(confidence).to be_a(field_confidence)
Expand Down