Commit e580061b authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #12908 from alexevans:Issue11855

parents b58a8729 a68835f7
......@@ -297,19 +297,21 @@ void cv::batchDistance( InputArray _src1, InputArray _src2,
nidx = Scalar::all(-1);
}
if( crosscheck )
{
CV_Assert( K == 1 && update == 0 && mask.empty() );
CV_Assert(!nidx.empty());
Mat tdist, tidx;
Mat tdist, tidx, sdist, sidx;
batchDistance(src2, src1, tdist, dtype, tidx, normType, K, mask, 0, false);
batchDistance(src1, src2, sdist, dtype, sidx, normType, K, mask, 0, false);
// if an idx-th element from src1 appeared to be the nearest to i-th element of src2,
// we update the minimum mutual distance between idx-th element of src1 and the whole src2 set.
// As a result, if nidx[idx] = i*, it means that idx-th element of src1 is the nearest
// to i*-th element of src2 and i*-th element of src2 is the closest to idx-th element of src1.
// If nidx[idx] = -1, it means that there is no such ideal couple for it in src2.
// This O(N) procedure is called cross-check and it helps to eliminate some false matches.
// This O(2N) procedure is called cross-check and it helps to eliminate some false matches.
if( dtype == CV_32S )
{
for( int i = 0; i < tdist.rows; i++ )
......@@ -336,6 +338,13 @@ void cv::batchDistance( InputArray _src1, InputArray _src2,
}
}
}
for( int i = 0; i < sdist.rows; i++ )
{
if( tidx.at<int>(sidx.at<int>(i)) != i )
{
nidx.at<int>(i) = -1;
}
}
return;
}
......
......@@ -558,4 +558,23 @@ TEST( Features2d_DMatch, read_write )
ASSERT_NE( strstr(str.c_str(), "4.5"), (char*)0 );
}
TEST(Features2d_DMatch, issue_11855)
{
Mat sources = (Mat_<uchar>(2, 3) << 1, 1, 0,
1, 1, 1);
Mat targets = (Mat_<uchar>(2, 3) << 1, 1, 1,
0, 0, 0);
Ptr<BFMatcher> bf = BFMatcher::create(NORM_HAMMING, true);
vector<vector<DMatch> > match;
bf->knnMatch(sources, targets, match, 1, noArray(), true);
ASSERT_EQ((size_t)1, match.size());
ASSERT_EQ((size_t)1, match[0].size());
EXPECT_EQ(1, match[0][0].queryIdx);
EXPECT_EQ(0, match[0][0].trainIdx);
EXPECT_EQ(0.0f, match[0][0].distance);
}
}} // namespace
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