Commit 1196eb33 authored by root's avatar root

remove non-ideal pairs when using crosscheck in batchdistance

parent cc2f8f17
...@@ -297,19 +297,21 @@ void cv::batchDistance( InputArray _src1, InputArray _src2, ...@@ -297,19 +297,21 @@ void cv::batchDistance( InputArray _src1, InputArray _src2,
nidx = Scalar::all(-1); nidx = Scalar::all(-1);
} }
if( crosscheck ) if( crosscheck )
{ {
CV_Assert( K == 1 && update == 0 && mask.empty() ); CV_Assert( K == 1 && update == 0 && mask.empty() );
CV_Assert(!nidx.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(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, // 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. // 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 // 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. // 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. // 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 ) if( dtype == CV_32S )
{ {
for( int i = 0; i < tdist.rows; i++ ) for( int i = 0; i < tdist.rows; i++ )
...@@ -336,6 +338,13 @@ void cv::batchDistance( InputArray _src1, InputArray _src2, ...@@ -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; return;
} }
......
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