|
|
|
@ -72,32 +72,32 @@ void LSDDetector::computeGaussianPyramid( const Mat& image, int numOctaves, int |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* check lines' extremes */ |
|
|
|
|
inline void checkLineExtremes( cv::Vec4i& extremes, cv::Size imageSize ) |
|
|
|
|
inline void checkLineExtremes( cv::Vec4f& extremes, cv::Size imageSize ) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
if( extremes[0] < 0 ) |
|
|
|
|
extremes[0] = 0; |
|
|
|
|
|
|
|
|
|
if( extremes[0] >= imageSize.width ) |
|
|
|
|
extremes[0] = imageSize.width - 1; |
|
|
|
|
extremes[0] = (float)imageSize.width - 1.0f; |
|
|
|
|
|
|
|
|
|
if( extremes[2] < 0 ) |
|
|
|
|
extremes[2] = 0; |
|
|
|
|
|
|
|
|
|
if( extremes[2] >= imageSize.width ) |
|
|
|
|
extremes[2] = imageSize.width - 1; |
|
|
|
|
extremes[2] = (float)imageSize.width - 1.0f; |
|
|
|
|
|
|
|
|
|
if( extremes[1] < 0 ) |
|
|
|
|
extremes[1] = 0; |
|
|
|
|
|
|
|
|
|
if( extremes[1] >= imageSize.height ) |
|
|
|
|
extremes[1] = imageSize.height - 1; |
|
|
|
|
extremes[1] = (float)imageSize.height - 1.0f; |
|
|
|
|
|
|
|
|
|
if( extremes[3] < 0 ) |
|
|
|
|
extremes[3] = 0; |
|
|
|
|
|
|
|
|
|
if( extremes[3] >= imageSize.height ) |
|
|
|
|
extremes[3] = imageSize.height - 1; |
|
|
|
|
extremes[3] = (float)imageSize.height - 1.0f; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* requires line detection (only one image) */ |
|
|
|
@ -148,48 +148,49 @@ void LSDDetector::detectImpl( const Mat& imageSrc, std::vector<KeyLine>& keyline |
|
|
|
|
cv::Ptr<cv::LineSegmentDetector> ls = cv::createLineSegmentDetector( cv::LSD_REFINE_ADV ); |
|
|
|
|
|
|
|
|
|
/* prepare a vector to host extracted segments */ |
|
|
|
|
std::vector<std::vector<cv::Vec4i> > lines_lsd; |
|
|
|
|
std::vector<std::vector<cv::Vec4f> > lines_lsd; |
|
|
|
|
|
|
|
|
|
/* extract lines */ |
|
|
|
|
for ( int i = 0; i < numOctaves; i++ ) |
|
|
|
|
{ |
|
|
|
|
std::vector<Vec4i> octave_lines; |
|
|
|
|
std::vector<Vec4f> octave_lines; |
|
|
|
|
ls->detect( gaussianPyrs[i], octave_lines ); |
|
|
|
|
lines_lsd.push_back( octave_lines ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* create keylines */ |
|
|
|
|
int class_counter = -1; |
|
|
|
|
for ( int j = 0; j < (int) lines_lsd.size(); j++ ) |
|
|
|
|
for ( int octaveIdx = 0; octaveIdx < (int) lines_lsd.size(); octaveIdx++ ) |
|
|
|
|
{ |
|
|
|
|
for ( int k = 0; k < (int) lines_lsd[j].size(); k++ ) |
|
|
|
|
float octaveScale = pow( (float)scale, octaveIdx ); |
|
|
|
|
for ( int k = 0; k < (int) lines_lsd[octaveIdx].size(); k++ ) |
|
|
|
|
{ |
|
|
|
|
KeyLine kl; |
|
|
|
|
cv::Vec4i extremes = lines_lsd[j][k]; |
|
|
|
|
cv::Vec4f extremes = lines_lsd[octaveIdx][k]; |
|
|
|
|
|
|
|
|
|
/* check data validity */ |
|
|
|
|
checkLineExtremes( extremes, gaussianPyrs[j].size() ); |
|
|
|
|
checkLineExtremes( extremes, gaussianPyrs[octaveIdx].size() ); |
|
|
|
|
|
|
|
|
|
/* fill KeyLine's fields */ |
|
|
|
|
kl.startPointX = (float) extremes[0]; |
|
|
|
|
kl.startPointY = (float) extremes[1]; |
|
|
|
|
kl.endPointX = (float) extremes[2]; |
|
|
|
|
kl.endPointY = (float) extremes[3]; |
|
|
|
|
kl.sPointInOctaveX = (float) extremes[0]; |
|
|
|
|
kl.sPointInOctaveY = (float) extremes[1]; |
|
|
|
|
kl.ePointInOctaveX = (float) extremes[2]; |
|
|
|
|
kl.ePointInOctaveY = (float) extremes[3]; |
|
|
|
|
kl.lineLength = (float) sqrt( pow( (float) extremes[0] - extremes[2], 2 ) + pow( (float) extremes[1] - extremes[3], 2 ) ); |
|
|
|
|
kl.startPointX = extremes[0] * octaveScale; |
|
|
|
|
kl.startPointY = extremes[1] * octaveScale; |
|
|
|
|
kl.endPointX = extremes[2] * octaveScale; |
|
|
|
|
kl.endPointY = extremes[3] * octaveScale; |
|
|
|
|
kl.sPointInOctaveX = extremes[0]; |
|
|
|
|
kl.sPointInOctaveY = extremes[1]; |
|
|
|
|
kl.ePointInOctaveX = extremes[2]; |
|
|
|
|
kl.ePointInOctaveY = extremes[3]; |
|
|
|
|
kl.lineLength = (float) sqrt( pow( extremes[0] - extremes[2], 2 ) + pow( extremes[1] - extremes[3], 2 ) ); |
|
|
|
|
|
|
|
|
|
/* compute number of pixels covered by line */ |
|
|
|
|
LineIterator li( gaussianPyrs[j], Point( extremes[0], extremes[1] ), Point( extremes[2], extremes[3] ) ); |
|
|
|
|
LineIterator li( gaussianPyrs[octaveIdx], Point2f( extremes[0], extremes[1] ), Point2f( extremes[2], extremes[3] ) ); |
|
|
|
|
kl.numOfPixels = li.count; |
|
|
|
|
|
|
|
|
|
kl.angle = atan2( ( kl.endPointY - kl.startPointY ), ( kl.endPointX - kl.startPointX ) ); |
|
|
|
|
kl.class_id = ++class_counter; |
|
|
|
|
kl.octave = j; |
|
|
|
|
kl.octave = octaveIdx; |
|
|
|
|
kl.size = ( kl.endPointX - kl.startPointX ) * ( kl.endPointY - kl.startPointY ); |
|
|
|
|
kl.response = kl.lineLength / max( gaussianPyrs[j].cols, gaussianPyrs[j].rows ); |
|
|
|
|
kl.response = kl.lineLength / max( gaussianPyrs[octaveIdx].cols, gaussianPyrs[octaveIdx].rows ); |
|
|
|
|
kl.pt = Point2f( ( kl.endPointX + kl.startPointX ) / 2, ( kl.endPointY + kl.startPointY ) / 2 ); |
|
|
|
|
|
|
|
|
|
keylines.push_back( kl ); |
|
|
|
|