Merge pull request #12908 from alexevans:Issue11855
This commit is contained in:
commit
e580061b74
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user