@@ -72,32 +72,32 @@ void LSDDetector::computeGaussianPyramid( const Mat& image, int numOctaves, int
72
72
}
73
73
74
74
/* check lines' extremes */
75
- inline void checkLineExtremes ( cv::Vec4i & extremes, cv::Size imageSize )
75
+ inline void checkLineExtremes ( cv::Vec4f & extremes, cv::Size imageSize )
76
76
{
77
77
78
78
if ( extremes[0 ] < 0 )
79
79
extremes[0 ] = 0 ;
80
80
81
81
if ( extremes[0 ] >= imageSize.width )
82
- extremes[0 ] = imageSize.width - 1 ;
82
+ extremes[0 ] = ( float ) imageSize.width - 1 . 0f ;
83
83
84
84
if ( extremes[2 ] < 0 )
85
85
extremes[2 ] = 0 ;
86
86
87
87
if ( extremes[2 ] >= imageSize.width )
88
- extremes[2 ] = imageSize.width - 1 ;
88
+ extremes[2 ] = ( float ) imageSize.width - 1 . 0f ;
89
89
90
90
if ( extremes[1 ] < 0 )
91
91
extremes[1 ] = 0 ;
92
92
93
93
if ( extremes[1 ] >= imageSize.height )
94
- extremes[1 ] = imageSize.height - 1 ;
94
+ extremes[1 ] = ( float ) imageSize.height - 1 . 0f ;
95
95
96
96
if ( extremes[3 ] < 0 )
97
97
extremes[3 ] = 0 ;
98
98
99
99
if ( extremes[3 ] >= imageSize.height )
100
- extremes[3 ] = imageSize.height - 1 ;
100
+ extremes[3 ] = ( float ) imageSize.height - 1 . 0f ;
101
101
}
102
102
103
103
/* requires line detection (only one image) */
@@ -148,48 +148,49 @@ void LSDDetector::detectImpl( const Mat& imageSrc, std::vector<KeyLine>& keyline
148
148
cv::Ptr<cv::LineSegmentDetector> ls = cv::createLineSegmentDetector ( cv::LSD_REFINE_ADV );
149
149
150
150
/* prepare a vector to host extracted segments */
151
- std::vector<std::vector<cv::Vec4i > > lines_lsd;
151
+ std::vector<std::vector<cv::Vec4f > > lines_lsd;
152
152
153
153
/* extract lines */
154
154
for ( int i = 0 ; i < numOctaves; i++ )
155
155
{
156
- std::vector<Vec4i > octave_lines;
156
+ std::vector<Vec4f > octave_lines;
157
157
ls->detect ( gaussianPyrs[i], octave_lines );
158
158
lines_lsd.push_back ( octave_lines );
159
159
}
160
160
161
161
/* create keylines */
162
162
int class_counter = -1 ;
163
- for ( int j = 0 ; j < (int ) lines_lsd.size (); j ++ )
163
+ for ( int octaveIdx = 0 ; octaveIdx < (int ) lines_lsd.size (); octaveIdx ++ )
164
164
{
165
- for ( int k = 0 ; k < (int ) lines_lsd[j].size (); k++ )
165
+ float octaveScale = pow ( (float )scale, octaveIdx );
166
+ for ( int k = 0 ; k < (int ) lines_lsd[octaveIdx].size (); k++ )
166
167
{
167
168
KeyLine kl;
168
- cv::Vec4i extremes = lines_lsd[j ][k];
169
+ cv::Vec4f extremes = lines_lsd[octaveIdx ][k];
169
170
170
171
/* check data validity */
171
- checkLineExtremes ( extremes, gaussianPyrs[j ].size () );
172
+ checkLineExtremes ( extremes, gaussianPyrs[octaveIdx ].size () );
172
173
173
174
/* fill KeyLine's fields */
174
- kl.startPointX = ( float ) extremes[0 ];
175
- kl.startPointY = ( float ) extremes[1 ];
176
- kl.endPointX = ( float ) extremes[2 ];
177
- kl.endPointY = ( float ) extremes[3 ];
178
- kl.sPointInOctaveX = ( float ) extremes[0 ];
179
- kl.sPointInOctaveY = ( float ) extremes[1 ];
180
- kl.ePointInOctaveX = ( float ) extremes[2 ];
181
- kl.ePointInOctaveY = ( float ) extremes[3 ];
182
- kl.lineLength = (float ) sqrt ( pow ( ( float ) extremes[0 ] - extremes[2 ], 2 ) + pow ( ( float ) extremes[1 ] - extremes[3 ], 2 ) );
175
+ kl.startPointX = extremes[0 ] * octaveScale ;
176
+ kl.startPointY = extremes[1 ] * octaveScale ;
177
+ kl.endPointX = extremes[2 ] * octaveScale ;
178
+ kl.endPointY = extremes[3 ] * octaveScale ;
179
+ kl.sPointInOctaveX = extremes[0 ];
180
+ kl.sPointInOctaveY = extremes[1 ];
181
+ kl.ePointInOctaveX = extremes[2 ];
182
+ kl.ePointInOctaveY = extremes[3 ];
183
+ kl.lineLength = (float ) sqrt ( pow ( extremes[0 ] - extremes[2 ], 2 ) + pow ( extremes[1 ] - extremes[3 ], 2 ) );
183
184
184
185
/* compute number of pixels covered by line */
185
- LineIterator li ( gaussianPyrs[j ], Point ( extremes[0 ], extremes[1 ] ), Point ( extremes[2 ], extremes[3 ] ) );
186
+ LineIterator li ( gaussianPyrs[octaveIdx ], Point2f ( extremes[0 ], extremes[1 ] ), Point2f ( extremes[2 ], extremes[3 ] ) );
186
187
kl.numOfPixels = li.count ;
187
188
188
189
kl.angle = atan2 ( ( kl.endPointY - kl.startPointY ), ( kl.endPointX - kl.startPointX ) );
189
190
kl.class_id = ++class_counter;
190
- kl.octave = j ;
191
+ kl.octave = octaveIdx ;
191
192
kl.size = ( kl.endPointX - kl.startPointX ) * ( kl.endPointY - kl.startPointY );
192
- kl.response = kl.lineLength / max ( gaussianPyrs[j ].cols , gaussianPyrs[j ].rows );
193
+ kl.response = kl.lineLength / max ( gaussianPyrs[octaveIdx ].cols , gaussianPyrs[octaveIdx ].rows );
193
194
kl.pt = Point2f ( ( kl.endPointX + kl.startPointX ) / 2 , ( kl.endPointY + kl.startPointY ) / 2 );
194
195
195
196
keylines.push_back ( kl );
0 commit comments