mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-21 06:11:09 +08:00
Detection test, smoothed removal, setter modified, samples corrected
This commit is contained in:
@@ -92,7 +92,7 @@ int main( int argc, char** argv )
|
||||
cv::Mat mask2 = Mat::ones( imageMat2.size(), CV_8UC1 );
|
||||
|
||||
/* create a pointer to a BinaryDescriptor object with default parameters */
|
||||
Ptr<BinaryDescriptor> bd = BinaryDescriptor::createBinaryDescriptor();
|
||||
Ptr<BinaryDescriptor> bd = BinaryDescriptor::createBinaryDescriptor( );
|
||||
|
||||
/* compute lines and descriptors */
|
||||
std::vector<KeyLine> keylines1, keylines2;
|
||||
@@ -101,27 +101,48 @@ int main( int argc, char** argv )
|
||||
( *bd )( imageMat1, mask1, keylines1, descr1, false, false );
|
||||
( *bd )( imageMat2, mask2, keylines2, descr2, false, false );
|
||||
|
||||
/* select keylines from first octave and their descriptors */
|
||||
std::vector<KeyLine> lbd_octave1, lbd_octave2;
|
||||
Mat left_lbd, right_lbd;
|
||||
for ( int i = 0; i < (int) keylines1.size(); i++ )
|
||||
{
|
||||
if( keylines1[i].octave == 0 )
|
||||
{
|
||||
lbd_octave1.push_back( keylines1[i] );
|
||||
left_lbd.push_back( descr1.row( i ) );
|
||||
}
|
||||
}
|
||||
|
||||
for ( int j = 0; j < (int) keylines2.size(); j++ )
|
||||
{
|
||||
if( keylines2[j].octave == 0 )
|
||||
{
|
||||
lbd_octave2.push_back( keylines2[j] );
|
||||
right_lbd.push_back( descr2.row( j ) );
|
||||
}
|
||||
}
|
||||
|
||||
/* create a BinaryDescriptorMatcher object */
|
||||
Ptr<BinaryDescriptorMatcher> bdm = BinaryDescriptorMatcher::createBinaryDescriptorMatcher();
|
||||
|
||||
/* require match */
|
||||
std::vector<DMatch> matches;
|
||||
bdm->match( descr1, descr2, matches );
|
||||
bdm->match( left_lbd, right_lbd, matches );
|
||||
|
||||
/* select best matches */
|
||||
std::vector<DMatch> good_matches;
|
||||
for(int i = 0; i<(int)matches.size(); i++)
|
||||
for ( int i = 0; i < (int) matches.size(); i++ )
|
||||
{
|
||||
if(matches[i].distance < MATCHES_DIST_THRESHOLD)
|
||||
good_matches.push_back(matches[i]);
|
||||
if( matches[i].distance < MATCHES_DIST_THRESHOLD )
|
||||
good_matches.push_back( matches[i] );
|
||||
}
|
||||
|
||||
/* plot matches */
|
||||
cv::Mat outImg;
|
||||
cv::Mat scaled1, scaled2;
|
||||
std::vector<char> mask( matches.size(), 1 );
|
||||
drawLineMatches( imageMat1, keylines1, imageMat2, keylines2, good_matches , outImg, Scalar::all( -1 ), Scalar::all( -1 ), mask,
|
||||
DrawLinesMatchesFlags::DEFAULT );
|
||||
drawLineMatches( imageMat1, lbd_octave1, imageMat2, lbd_octave2, good_matches, outImg, Scalar::all( -1 ), Scalar::all( -1 ), mask,
|
||||
DrawLinesMatchesFlags::DEFAULT );
|
||||
|
||||
imshow( "Matches", outImg );
|
||||
waitKey();
|
||||
@@ -132,48 +153,55 @@ int main( int argc, char** argv )
|
||||
/* detect lines */
|
||||
std::vector<KeyLine> klsd1, klsd2;
|
||||
Mat lsd_descr1, lsd_descr2;
|
||||
lsd->detect(imageMat1, klsd1, 2, 2, mask1);
|
||||
lsd->detect(imageMat2, klsd2, 2, 2, mask2);
|
||||
|
||||
/* select lines from first octave */
|
||||
std::vector<KeyLine> octave0_1, octave0_2;
|
||||
for(int i = 0; i<(int)klsd1.size(); i++)
|
||||
{
|
||||
if(klsd1[i].octave == 0)
|
||||
octave0_1.push_back(klsd1[i]);
|
||||
}
|
||||
|
||||
for(int j = 0; j<(int)klsd1.size(); j++)
|
||||
{
|
||||
if(klsd2[j].octave == 0)
|
||||
octave0_2.push_back(klsd2[j]);
|
||||
}
|
||||
|
||||
lsd->detect( imageMat1, klsd1, 2, 2, mask1 );
|
||||
lsd->detect( imageMat2, klsd2, 2, 2, mask2 );
|
||||
|
||||
/* compute descriptors for lines from first octave */
|
||||
bd->compute( imageMat1, octave0_1, lsd_descr1 );
|
||||
bd->compute( imageMat2, octave0_2, lsd_descr2 );
|
||||
bd->compute( imageMat1, klsd1, lsd_descr1 );
|
||||
bd->compute( imageMat2, klsd2, lsd_descr2 );
|
||||
|
||||
/* select lines and descriptors from first octave */
|
||||
std::vector<KeyLine> octave0_1, octave0_2;
|
||||
Mat leftDEscr, rightDescr;
|
||||
for ( int i = 0; i < (int) klsd1.size(); i++ )
|
||||
{
|
||||
if( klsd1[i].octave == 1 )
|
||||
{
|
||||
octave0_1.push_back( klsd1[i] );
|
||||
leftDEscr.push_back( lsd_descr1.row( i ) );
|
||||
}
|
||||
}
|
||||
|
||||
for ( int j = 0; j < (int) klsd2.size(); j++ )
|
||||
{
|
||||
if( klsd2[j].octave == 1 )
|
||||
{
|
||||
octave0_2.push_back( klsd2[j] );
|
||||
rightDescr.push_back( lsd_descr2.row( j ) );
|
||||
}
|
||||
}
|
||||
|
||||
/* compute matches */
|
||||
std::vector<DMatch> lsd_matches;
|
||||
bdm->match( lsd_descr1, lsd_descr2, lsd_matches);
|
||||
bdm->match( leftDEscr, rightDescr, lsd_matches );
|
||||
|
||||
/* select best matches */
|
||||
good_matches.clear();
|
||||
for(int i = 0; i<(int)lsd_matches.size(); i++)
|
||||
{
|
||||
if(lsd_matches[i].distance < MATCHES_DIST_THRESHOLD)
|
||||
good_matches.push_back(lsd_matches[i]);
|
||||
}
|
||||
|
||||
for ( int i = 0; i < (int) lsd_matches.size(); i++ )
|
||||
{
|
||||
if( lsd_matches[i].distance < MATCHES_DIST_THRESHOLD )
|
||||
good_matches.push_back( lsd_matches[i] );
|
||||
}
|
||||
|
||||
/* plot matches */
|
||||
cv::Mat lsd_outImg;
|
||||
resize( imageMat1, imageMat1, Size( imageMat1.cols / 2, imageMat1.rows / 2 ) );
|
||||
resize( imageMat2, imageMat2, Size( imageMat2.cols / 2, imageMat2.rows / 2 ) );
|
||||
std::vector<char> lsd_mask( matches.size(), 1 );
|
||||
drawLineMatches( imageMat1, octave0_1, imageMat2, octave0_2, good_matches , lsd_outImg, Scalar::all( -1 ), Scalar::all( -1 ), lsd_mask,
|
||||
drawLineMatches( imageMat1, octave0_1, imageMat2, octave0_2, good_matches, lsd_outImg, Scalar::all( -1 ), Scalar::all( -1 ), lsd_mask,
|
||||
DrawLinesMatchesFlags::DEFAULT );
|
||||
|
||||
imshow("LSD matches", lsd_outImg);
|
||||
imshow( "LSD matches", lsd_outImg );
|
||||
waitKey();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user