mirror of
https://github.com/opencv/opencv.git
synced 2024-11-27 20:50:25 +08:00
remove non-ideal pairs when using crosscheck in batchdistance
This commit is contained in:
parent
cc2f8f1778
commit
1196eb33fc
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user