panomosity 0.1.19 → 0.1.20

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d31e6f456b80f0429a224a93939514115dd1f944e4a01c0e4b3992347d9c870
4
- data.tar.gz: fc71c2b94cb75a36ed249b728a9382350fc72ac5562c3dd644f31a5289969523
3
+ metadata.gz: 29ffa367e9aa586c70f99b092cc16361d782228b43d7403f526480736f077786
4
+ data.tar.gz: 6d0d06a32d28236b703ed604189c3a9548badf9ddf8c883aacbf846bee165296
5
5
  SHA512:
6
- metadata.gz: 7b2697110bf392a3d7f15371ca57e7835a149c8dd371cc45317559a005b57ba2b8edbc696d7e87e1f12111a325567e066988eba06614cd61b8b9c1a3d9cd4dd8
7
- data.tar.gz: b55224d26f9b7f0e45fbcc26478517c39e3c80482dc9f16496b811cc94352bef5dc1e62173abc784ace3dc73c4df0f0adf0cda642897a3df8eb79d10445d8b50
6
+ metadata.gz: 285fa9879122939d631ed74395948b702c626e2e0104d1cd9d1a346c58bbbcb90c8d134826d97c9c70e94256e582b4afdbff95cdc6b988c04e12ca10bce0beb0
7
+ data.tar.gz: 98c7bcabe7f5a3e2d4435c8d44fbe5496a7ec3bdbe5b5dff498d7d6022f346e65bc76bae1f7cfe4c1dfaeb68bd57acd65bc2980a1daf60293c657e7541bd8e5d
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- panomosity (0.1.18)
4
+ panomosity (0.1.19)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -3,7 +3,7 @@
3
3
 
4
4
  module Panomosity
5
5
  class ControlPoint
6
- @@attributes = %i(n N x y X Y t)
6
+ @@attributes = %i(n N x y X Y t g)
7
7
  @@calculated_attributes = %i(dist px py pdist prx pry prdist conn_type i1 i2)
8
8
 
9
9
  def self.parse(pto_file, cp_type: nil, compact: false)
@@ -161,18 +161,27 @@ module Panomosity
161
161
  vertical? || horizontal?
162
162
  end
163
163
 
164
+ def generated?
165
+ !g.nil?
166
+ end
167
+
168
+ def not_generated?
169
+ !generated?
170
+ end
171
+
164
172
  def to_s
165
- line_values = @@attributes.map { |attribute| "#{attribute}#{self.send(attribute)}" }
173
+ attrs = generated? ? @@attributes : (@@attributes - %i(g))
174
+ line_values = attrs.map { |attribute| "#{attribute}#{self.send(attribute)}" }
166
175
  "c #{line_values.join(' ')}\n"
167
176
  end
168
177
 
169
178
  def ==(o)
170
179
  n1 == o.n1 &&
171
- n2 == o.n2 &&
172
- x1.floor == o.x1.floor &&
173
- x2.floor == o.x2.floor &&
174
- y1.floor == o.y1.floor &&
175
- y2.floor == o.y2.floor
180
+ n2 == o.n2 &&
181
+ x1.floor == o.x1.floor &&
182
+ x2.floor == o.x2.floor &&
183
+ y1.floor == o.y1.floor &&
184
+ y2.floor == o.y2.floor
176
185
  end
177
186
 
178
187
  def recalculate_pixel_distance
@@ -14,25 +14,28 @@ module Panomosity
14
14
  end
15
15
 
16
16
  def calculate
17
+ # Do not include generated control points in neighborhood calculations
18
+ pair_control_points = pair.control_points.select(&:not_generated?)
19
+
17
20
  # Instead of setting a static distance use a distance that is dependent on the type of connection
18
21
  if pair.horizontal?
19
22
  @pair_distance = (pair.first_image.h * 0.1).round
20
- @control_points = pair.control_points.select do |cp|
23
+ @control_points = pair_control_points.select do |cp|
21
24
  cp.x1.between?(center.x1 - distance, center.x1 + distance) && cp.y1.between?(center.y1 - pair_distance, center.y1 + pair_distance)
22
25
  end
23
26
  else
24
27
  @pair_distance = (pair.first_image.w * 0.1).round
25
- @control_points = pair.control_points.select do |cp|
28
+ @control_points = pair_control_points.select do |cp|
26
29
  cp.x1.between?(center.x1 - pair_distance, center.x1 + pair_distance) && cp.y1.between?(center.y1 - distance, center.y1 + distance)
27
30
  end
28
31
  end
29
32
 
30
- @prdist_avg, @prdist_std = *calculate_average_and_std(values: control_points.map(&:prdist))
31
- @prx_avg, @prx_std = *calculate_average_and_std(values: control_points.map(&:prx))
32
- @pry_avg, @pry_std = *calculate_average_and_std(values: control_points.map(&:pry))
33
+ @prdist_avg, @prdist_std = *calculate_average_and_std(values: control_points.map(&:prdist), ignore_empty: true)
34
+ @prx_avg, @prx_std = *calculate_average_and_std(values: control_points.map(&:prx), ignore_empty: true)
35
+ @pry_avg, @pry_std = *calculate_average_and_std(values: control_points.map(&:pry), ignore_empty: true)
33
36
 
34
37
  # add in control points that have similar distances (within std)
35
- @control_points_within_std = pair.control_points.select { |c| c.prdist.between?(center.prdist - prdist_std, center.prdist + prdist_std) }
38
+ @control_points_within_std = pair_control_points.select { |c| c.prdist.between?(center.prdist - prdist_std, center.prdist + prdist_std) }
36
39
  self
37
40
  end
38
41
 
@@ -98,7 +98,7 @@ module Panomosity
98
98
 
99
99
  def calculate
100
100
  @neighborhoods = total_neighborhoods.select { |n| (n.prdist_avg - center.prdist_avg).abs <= center.prdist_std }
101
- @control_points = neighborhoods.map(&:control_points_within_std).flatten.uniq { |cp| cp.raw }
101
+ @control_points = neighborhoods.map(&:control_points_within_std).flatten.uniq(&:raw)
102
102
  @x_avg = calculate_average(values: control_points.map(&:px))
103
103
  @y_avg = calculate_average(values: control_points.map(&:py))
104
104
  @prdist_avg = center.prdist_avg
@@ -23,7 +23,7 @@ module Panomosity
23
23
  end
24
24
 
25
25
  def good_control_points_to_keep
26
- @pairs.map(&:good_control_points_to_keep).flatten.uniq { |cp| cp.raw }
26
+ @pairs.map(&:good_control_points_to_keep).flatten.uniq(&:raw)
27
27
  end
28
28
 
29
29
  def unconnected
@@ -83,6 +83,12 @@ module Panomosity
83
83
  log_detailed_neighborhood_info(name: :vertical, pairs: @vertical_pairs)
84
84
  end
85
85
 
86
+ def self.calculate_neighborhood_groups
87
+ NeighborhoodGroup.parse_info(@panorama)
88
+ NeighborhoodGroup.calculate(name: :horizontal, pairs: @horizontal_pairs)
89
+ NeighborhoodGroup.calculate(name: :vertical, pairs: @vertical_pairs)
90
+ end
91
+
86
92
  def self.log_detailed_neighborhood_info(name: :horizontal, pairs: [])
87
93
  return unless @panorama.options[:very_verbose]
88
94
  logger.debug "showing #{name} pair information"
@@ -98,12 +104,6 @@ module Panomosity
98
104
  end
99
105
  end
100
106
 
101
- def self.calculate_neighborhood_groups
102
- NeighborhoodGroup.parse_info(@panorama)
103
- NeighborhoodGroup.calculate(name: :horizontal, pairs: @horizontal_pairs)
104
- NeighborhoodGroup.calculate(name: :vertical, pairs: @vertical_pairs)
105
- end
106
-
107
107
  def self.info
108
108
  logger.debug "total number of control points: #{@pairs.map(&:control_points).flatten.count}"
109
109
  logger.debug 'displaying horizontal pair info'
@@ -117,6 +117,25 @@ module Panomosity
117
117
  logger.debug "control points: x_dist,x_std: #{x_dist},#{x_std} | y_dist,y_std: #{y_dist},#{y_std} | dist,std: #{dist},#{std}"
118
118
  logger.debug "total number of neighborhoods: #{pair.neighborhoods.count}"
119
119
  logger.debug "total number single cp neighborhoods: #{pair.neighborhoods.select{|n| n.control_points.count == 1}.count}"
120
+ logger.debug "total number generated control points: #{pair.control_points.select(&:generated?).count}"
121
+ pair.neighborhoods.each do |neighborhood|
122
+ logger.debug neighborhood.info
123
+ logger.debug "neighborhood: distance,pair_distance: #{neighborhood.distance},#{neighborhood.pair_distance} | total number of control points: #{neighborhood.control_points.count}"
124
+ logger.debug "neighborhood: center prdist: #{neighborhood.center.prdist} | total number of control points within std: #{neighborhood.control_points_within_std.count}"
125
+ end
126
+ end
127
+ logger.debug 'displaying vertical pair info'
128
+ logger.debug "total number of vertical control points: #{@vertical_pairs.map(&:control_points).flatten.count}"
129
+ @vertical_pairs.each do |pair|
130
+ logger.debug pair.info
131
+ logger.debug "total number of control points: #{pair.control_points.count}"
132
+ x_dist, x_std = *calculate_average_and_std(values: pair.control_points.map(&:prx))
133
+ y_dist, y_std = *calculate_average_and_std(values: pair.control_points.map(&:pry))
134
+ dist, std = *calculate_average_and_std(values: pair.control_points.map(&:prdist))
135
+ logger.debug "control points: x_dist,x_std: #{x_dist},#{x_std} | y_dist,y_std: #{y_dist},#{y_std} | dist,std: #{dist},#{std}"
136
+ logger.debug "total number of neighborhoods: #{pair.neighborhoods.count}"
137
+ logger.debug "total number single cp neighborhoods: #{pair.neighborhoods.select{|n| n.control_points.count == 1}.count}"
138
+ logger.debug "total number generated control points: #{pair.control_points.select(&:generated?).count}"
120
139
  pair.neighborhoods.each do |neighborhood|
121
140
  logger.debug neighborhood.info
122
141
  logger.debug "neighborhood: distance,pair_distance: #{neighborhood.distance},#{neighborhood.pair_distance} | total number of control points: #{neighborhood.control_points.count}"
@@ -133,7 +152,7 @@ module Panomosity
133
152
  end
134
153
 
135
154
  def to_s
136
- pair.map(&:id)
155
+ pair.map(&:id).to_s.gsub(' ', '')
137
156
  end
138
157
 
139
158
  def info
@@ -181,7 +200,7 @@ module Panomosity
181
200
  end
182
201
 
183
202
  def good_control_points_to_keep(count: 3)
184
- control_points_to_keep = good_neighborhoods_within_std(count: count).map(&:control_points_within_std).flatten.uniq { |cp| cp.raw }
203
+ control_points_to_keep = good_neighborhoods_within_std(count: count).map(&:control_points_within_std).flatten.uniq(&:raw)
185
204
 
186
205
  # Keep all our control points if we have less than 10
187
206
  if control_points.count >= 10
@@ -19,11 +19,16 @@ module Panomosity
19
19
  Pair.calculate_neighborhoods(self)
20
20
  control_points_to_keep = Pair.good_control_points_to_keep
21
21
  bad_control_points = control_points.reject { |cp| control_points_to_keep.map(&:raw).include?(cp.raw) }
22
- control_point_ratio = bad_control_points.count.to_f / control_points.count
22
+ far_control_points = control_points.select { |cp| cp.prdist > 50 }
23
+ control_points_to_clean = (bad_control_points + far_control_points).uniq(&:raw)
24
+
25
+ # log warnings
26
+ control_point_ratio = control_points_to_clean.count.to_f / control_points.count
23
27
  logger.warn "Removing more than 30% (#{(control_point_ratio*100).round(4)}%) of control points. May potentially cause issues." if control_point_ratio >= 0.3
24
28
  control_point_pair_ratio = Pair.without_enough_control_points(ignore_connected: true).count.to_f / Pair.all.count
25
29
  logger.warn "More than 50% (#{(control_point_pair_ratio*100).round(4)}%) of pairs have fewer than 3 control points. May potentially cause issues." if control_point_pair_ratio >= 0.5
26
- bad_control_points
30
+
31
+ control_points_to_clean
27
32
  end
28
33
 
29
34
  def fix_unconnected_image_pairs
@@ -122,6 +127,9 @@ module Panomosity
122
127
  control_point[:x] += i.w * 0.25
123
128
  control_point[:X] += i.w * 0.25
124
129
  end
130
+ # marks the control point as generated
131
+
132
+ control_point[:g] = 0
125
133
  control_point.to_s
126
134
  end.join
127
135
  end
@@ -1,3 +1,3 @@
1
1
  module Panomosity
2
- VERSION = '0.1.19'
2
+ VERSION = '0.1.20'
3
3
  end
data/lib/panomosity.rb CHANGED
@@ -58,7 +58,7 @@ module Panomosity
58
58
  options[:verbose] = v
59
59
  end
60
60
 
61
- parser.on('-v', '--vverbose', 'Run very verbosely') do |v|
61
+ parser.on('-vv', '--vverbose', 'Run very verbosely') do |v|
62
62
  options[:very_verbose] = v
63
63
  end
64
64
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: panomosity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.19
4
+ version: 0.1.20
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oliver Garcia
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-08 00:00:00.000000000 Z
11
+ date: 2018-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler