panomosity 0.1.30 → 0.1.31

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: 75a840caab3ec6ccf1d6ac9a815037041c2b9b8fa5fb241185f8e5f7fac47371
4
- data.tar.gz: 1abc680b6613331381b61047072df57f30242f188bea2e0ba4be1eb433065966
3
+ metadata.gz: ccef3c9690bcf25e476c65a9f25ef883049ccb26f98695dc58a7b0b8bdf5f868
4
+ data.tar.gz: e31c54fb190df4d63892dff79b6ccfae9e233cf63b6aae8ade8ad05c983299a6
5
5
  SHA512:
6
- metadata.gz: 3828862db188158ee5e1101cdff98649c2e90ef9d314f6e370a2ca0d6743b7da88cf9c87571205d554142dae69dd29bfa32eb25ebf68ade0333443673b49d282
7
- data.tar.gz: c076ec3e926bfe49972868766660bfe9d72d5fdcc81441943da4a8d5f29eaffc8f57909d142049b523ad1dc054b128aa6dc0a334e877291adc8df369db684afb
6
+ metadata.gz: 4921ab8f4d713a3e92ba8bab50a8ae3412e05ac7dabe7deb1344fc46434c1064f3fae845e2219f5888deebd87be050c1a9e71566cd92998aa2bd7d704d051954
7
+ data.tar.gz: b48fdc2849592a0015efa842080b49ede5dadb48ef0a394c9d8a0ffe2e9f30ce6705717ed7abf2d11d3bfabdf42a4810507b0467eae81727a4bbb87ac22a2e06
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- panomosity (0.1.29)
4
+ panomosity (0.1.30)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -4,7 +4,7 @@
4
4
  module Panomosity
5
5
  class ControlPoint
6
6
  @@attributes = %i(n N x y X Y t g)
7
- @@calculated_attributes = %i(dist px py pdist prx pry prdist conn_type i1 i2)
7
+ @@calculated_attributes = %i(dist px py pdist prx pry prdist conn_type i1 i2 roll)
8
8
 
9
9
  def self.parse(pto_file, cp_type: nil, compact: false)
10
10
  @control_points = pto_file.each_line.map do |line|
@@ -66,12 +66,18 @@ module Panomosity
66
66
  cp.pdist = Math.sqrt(cp.px ** 2 + cp.py ** 2)
67
67
 
68
68
  # pixel distance including roll
69
+ cp.conn_type = image1.column == image2.column ? :vertical : :horizontal
69
70
  r = image1.r * Math::PI / 180
71
+
72
+ if cp.conn_type == :horizontal
73
+ cp.roll = Math.atan(-(cp.y2 - cp.y1) / (cp.x2 - cp.x1)) * 180.0 / Math::PI
74
+ else
75
+ cp.roll = Math.atan((cp.x2 - cp.x1) / (cp.y2 - cp.y1)) * 180.0 / Math::PI
76
+ end
70
77
  cp.prx = image1.d - image2.d + Math.cos(r) * (cp.x2 - cp.x1) - Math.sin(r) * (cp.y2 - cp.y1)
71
- cp.pry = image1.e - image2.e + Math.cos(r) * (cp.y2 - cp.y1) - Math.sin(r) * (cp.x2 - cp.x1)
78
+ cp.pry = image1.e - image2.e + Math.cos(r) * (cp.y2 - cp.y1) + Math.sin(r) * (cp.x2 - cp.x1)
72
79
  cp.prdist = Math.sqrt(cp.prx ** 2 + cp.pry ** 2)
73
80
 
74
- cp.conn_type = image1.column == image2.column ? :vertical : :horizontal
75
81
  cp.i1 = image1
76
82
  cp.i2 = image2
77
83
  end
@@ -189,6 +195,11 @@ module Panomosity
189
195
  self.prx = i1.d - i2.d + Math.cos(r) * (x2 - x1) - Math.sin(r) * (y2 - y1)
190
196
  self.pry = i1.e - i2.e + Math.cos(r) * (y2 - y1) - Math.sin(r) * (x2 - x1)
191
197
  self.prdist = Math.sqrt(prx ** 2 + pry ** 2)
198
+ if conn_type == :horizontal
199
+ self.roll = Math.atan(-(y2 - y1) / (x2 - x1)) * 180.0 / Math::PI
200
+ else
201
+ self.roll = Math.atan((x2 - x1) / (y2 - y1)) * 180.0 / Math::PI
202
+ end
192
203
  end
193
204
 
194
205
  def detailed_info
@@ -6,7 +6,7 @@ module Panomosity
6
6
  extend Panomosity::Utils
7
7
 
8
8
  attr_accessor :center, :total_neighborhoods, :neighborhoods, :control_points, :prdist_avg, :prdist_std, :x_avg,
9
- :y_avg
9
+ :rx_avg, :y_avg, :ry_avg
10
10
 
11
11
  class << self
12
12
  attr_accessor :logger
@@ -81,10 +81,7 @@ module Panomosity
81
81
  end
82
82
 
83
83
  neighborhood_groups.max_by(5) { |ng| ng.control_points.count }.each do |ng|
84
- logger.debug "#{ng.prdist_avg} #{ng.prdist_std} #{ng.control_points.count} x#{ng.x_avg} y#{ng.y_avg}"
85
- logger.debug "#{calculate_average(values: ng.control_points.map(&:pdist))} x#{calculate_average(values: ng.control_points.map(&:px))} y#{calculate_average(values: ng.control_points.map(&:py))}"
86
-
87
- ng.control_points.each { |point| logger.debug point.detailed_info }
84
+ logger.debug "#{ng.prdist_avg} #{ng.prdist_std} #{ng.control_points.count} x#{ng.x_avg} y#{ng.y_avg} rx#{ng.rx_avg} ry#{ng.ry_avg}"
88
85
  end
89
86
 
90
87
  self.neighborhood_groups = neighborhood_groups.sort_by { |ng| -ng.control_points.count }
@@ -103,9 +100,10 @@ module Panomosity
103
100
  @neighborhoods = total_neighborhoods.select { |n| (n.prdist_avg - center.prdist_avg).abs <= center.prdist_std }
104
101
  @control_points = neighborhoods.map(&:control_points_within_std).flatten.uniq(&:raw)
105
102
  @x_avg = calculate_average(values: control_points.map(&:px))
103
+ @rx_avg = calculate_average(values: control_points.map(&:prx))
106
104
  @y_avg = calculate_average(values: control_points.map(&:py))
107
- @prdist_avg = center.prdist_avg
108
- @prdist_std = center.prdist_std
105
+ @ry_avg = calculate_average(values: control_points.map(&:pry))
106
+ @prdist_avg, @prdist_std = *calculate_average_and_std(values: control_points.map(&:prdist))
109
107
  self
110
108
  end
111
109
 
@@ -90,6 +90,15 @@ module Panomosity
90
90
  return
91
91
  end
92
92
 
93
+ roll = calculate_estimated_roll
94
+ if roll
95
+ logger.debug "using calculated horizontal roll #{roll}"
96
+ images.each do |image|
97
+ image.r = roll
98
+ end
99
+ return
100
+ end
101
+
93
102
  # we grab the top 5 neighborhood groups and get the average distance for them and average that
94
103
  dist_avg = calculate_average_distance
95
104
 
@@ -143,5 +152,26 @@ module Panomosity
143
152
  panorama.control_points = ControlPoint.calculate_distances(panorama.images, panorama.variable)
144
153
  calculate_average_distance
145
154
  end
155
+
156
+ def calculate_estimated_roll
157
+ return
158
+ # setting to 0
159
+ images.each do |image|
160
+ image.r = 0.0
161
+ end
162
+ Pair.calculate_neighborhoods(panorama)
163
+ Pair.calculate_neighborhood_groups
164
+ cps = NeighborhoodGroup.horizontal.first.control_points
165
+ avg, std = *calculate_average_and_std(values: cps.map(&:roll))
166
+ # 0.1 degrees of std
167
+ while std > 0.1
168
+ cps.select!{|c| (avg - c.roll).abs <= std}
169
+ avg, std = *calculate_average_and_std(values: cps.map(&:roll))
170
+ end
171
+ avg
172
+ rescue
173
+ logger.debug 'estimating roll failed'
174
+ nil
175
+ end
146
176
  end
147
177
  end
@@ -1,3 +1,3 @@
1
1
  module Panomosity
2
- VERSION = '0.1.30'
2
+ VERSION = '0.1.31'
3
3
  end
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.30
4
+ version: 0.1.31
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-12-06 00:00:00.000000000 Z
11
+ date: 2018-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler