Commit e6cc1be7 authored by Alexander Alekhin's avatar Alexander Alekhin Committed by Andrey Pavlenko

stitching: allow to use dynamic DescriptorMatcher

parent 06738468
...@@ -1369,6 +1369,21 @@ void _InputArray::getUMatVector(std::vector<UMat>& umv) const ...@@ -1369,6 +1369,21 @@ void _InputArray::getUMatVector(std::vector<UMat>& umv) const
return; return;
} }
if( k == UMAT )
{
UMat& v = *(UMat*)obj;
umv.resize(1);
umv[0] = v;
return;
}
if( k == MAT )
{
Mat& v = *(Mat*)obj;
umv.resize(1);
umv[0] = v.getUMat(accessFlags);
return;
}
CV_Error(Error::StsNotImplemented, "Unknown/unsupported array type"); CV_Error(Error::StsNotImplemented, "Unknown/unsupported array type");
} }
......
...@@ -330,7 +330,7 @@ static bool ocl_match2Dispatcher(InputArray query, InputArray train, const UMat ...@@ -330,7 +330,7 @@ static bool ocl_match2Dispatcher(InputArray query, InputArray train, const UMat
static bool ocl_kmatchDispatcher(InputArray query, InputArray train, const UMat &trainIdx, static bool ocl_kmatchDispatcher(InputArray query, InputArray train, const UMat &trainIdx,
const UMat &distance, int distType) const UMat &distance, int distType)
{ {
return ocl_match2Dispatcher(query, train, trainIdx, distance, distType); return ocl_match2Dispatcher(query, train, trainIdx, distance, distType);
} }
static bool ocl_knnMatchSingle(InputArray query, InputArray train, UMat &trainIdx, static bool ocl_knnMatchSingle(InputArray query, InputArray train, UMat &trainIdx,
...@@ -1209,8 +1209,8 @@ FlannBasedMatcher::FlannBasedMatcher( const Ptr<flann::IndexParams>& _indexParam ...@@ -1209,8 +1209,8 @@ FlannBasedMatcher::FlannBasedMatcher( const Ptr<flann::IndexParams>& _indexParam
void FlannBasedMatcher::add( InputArrayOfArrays _descriptors ) void FlannBasedMatcher::add( InputArrayOfArrays _descriptors )
{ {
DescriptorMatcher::add( _descriptors ); DescriptorMatcher::add( _descriptors );
std::vector<Mat> descriptors; std::vector<UMat> descriptors;
_descriptors.getMatVector(descriptors); _descriptors.getUMatVector(descriptors);
for( size_t i = 0; i < descriptors.size(); i++ ) for( size_t i = 0; i < descriptors.size(); i++ )
{ {
......
...@@ -155,21 +155,31 @@ void CpuMatcher::match(const ImageFeatures &features1, const ImageFeatures &feat ...@@ -155,21 +155,31 @@ void CpuMatcher::match(const ImageFeatures &features1, const ImageFeatures &feat
matches_info.matches.clear(); matches_info.matches.clear();
Ptr<flann::IndexParams> indexParams = makePtr<flann::KDTreeIndexParams>(); Ptr<DescriptorMatcher> matcher;
Ptr<flann::SearchParams> searchParams = makePtr<flann::SearchParams>(); #if 0 // TODO check this
if (ocl::useOpenCL())
if (features2.descriptors.depth() == CV_8U)
{ {
indexParams->setAlgorithm(cvflann::FLANN_INDEX_LSH); matcher = makePtr<BFMatcher>((int)NORM_L2);
searchParams->setAlgorithm(cvflann::FLANN_INDEX_LSH);
} }
else
#endif
{
Ptr<flann::IndexParams> indexParams = makePtr<flann::KDTreeIndexParams>();
Ptr<flann::SearchParams> searchParams = makePtr<flann::SearchParams>();
FlannBasedMatcher matcher(indexParams, searchParams); if (features2.descriptors.depth() == CV_8U)
{
indexParams->setAlgorithm(cvflann::FLANN_INDEX_LSH);
searchParams->setAlgorithm(cvflann::FLANN_INDEX_LSH);
}
matcher = makePtr<FlannBasedMatcher>(indexParams, searchParams);
}
std::vector< std::vector<DMatch> > pair_matches; std::vector< std::vector<DMatch> > pair_matches;
MatchesSet matches; MatchesSet matches;
// Find 1->2 matches // Find 1->2 matches
matcher.knnMatch(features1.descriptors, features2.descriptors, pair_matches, 2); matcher->knnMatch(features1.descriptors, features2.descriptors, pair_matches, 2);
for (size_t i = 0; i < pair_matches.size(); ++i) for (size_t i = 0; i < pair_matches.size(); ++i)
{ {
if (pair_matches[i].size() < 2) if (pair_matches[i].size() < 2)
...@@ -186,7 +196,7 @@ void CpuMatcher::match(const ImageFeatures &features1, const ImageFeatures &feat ...@@ -186,7 +196,7 @@ void CpuMatcher::match(const ImageFeatures &features1, const ImageFeatures &feat
// Find 2->1 matches // Find 2->1 matches
pair_matches.clear(); pair_matches.clear();
matcher.knnMatch(features2.descriptors, features1.descriptors, pair_matches, 2); matcher->knnMatch(features2.descriptors, features1.descriptors, pair_matches, 2);
for (size_t i = 0; i < pair_matches.size(); ++i) for (size_t i = 0; i < pair_matches.size(); ++i)
{ {
if (pair_matches[i].size() < 2) if (pair_matches[i].size() < 2)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment