mirror of
https://github.com/opencv/opencv.git
synced 2025-01-18 14:13:15 +08:00
Speedup AGAST nonmax-suppression.
This commit is contained in:
parent
3a3f4038bf
commit
fdbed4a473
@ -7511,19 +7511,22 @@ Ptr<AgastFeatureDetector> AgastFeatureDetector::create( int threshold, bool nonm
|
||||
|
||||
void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, bool nonmax_suppression, int type)
|
||||
{
|
||||
|
||||
std::vector<KeyPoint> kpts;
|
||||
|
||||
// detect
|
||||
switch(type) {
|
||||
case AgastFeatureDetector::AGAST_5_8:
|
||||
AGAST_5_8(_img, keypoints, threshold);
|
||||
AGAST_5_8(_img, kpts, threshold);
|
||||
break;
|
||||
case AgastFeatureDetector::AGAST_7_12d:
|
||||
AGAST_7_12d(_img, keypoints, threshold);
|
||||
AGAST_7_12d(_img, kpts, threshold);
|
||||
break;
|
||||
case AgastFeatureDetector::AGAST_7_12s:
|
||||
AGAST_7_12s(_img, keypoints, threshold);
|
||||
AGAST_7_12s(_img, kpts, threshold);
|
||||
break;
|
||||
case AgastFeatureDetector::OAST_9_16:
|
||||
OAST_9_16(_img, keypoints, threshold);
|
||||
OAST_9_16(_img, kpts, threshold);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -7534,7 +7537,7 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
|
||||
makeAgastOffsets(pixel_, (int)img.step, type);
|
||||
|
||||
std::vector<KeyPoint>::iterator kpt;
|
||||
for(kpt = keypoints.begin(); kpt != keypoints.end(); kpt++)
|
||||
for(kpt = kpts.begin(); kpt != kpts.end(); kpt++)
|
||||
{
|
||||
switch(type) {
|
||||
case AgastFeatureDetector::AGAST_5_8:
|
||||
@ -7555,20 +7558,21 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// suppression
|
||||
if(nonmax_suppression)
|
||||
{
|
||||
size_t j;
|
||||
size_t curr_idx;
|
||||
size_t lastRow = 0, next_lastRow = 0;
|
||||
size_t num_Corners = keypoints.size();
|
||||
size_t num_Corners = kpts.size();
|
||||
size_t lastRowCorner_ind = 0, next_lastRowCorner_ind = 0;
|
||||
|
||||
std::vector<int> nmsFlags;
|
||||
std::vector<KeyPoint>::iterator currCorner_nms;
|
||||
std::vector<KeyPoint>::const_iterator currCorner;
|
||||
|
||||
currCorner = keypoints.begin();
|
||||
currCorner = kpts.begin();
|
||||
|
||||
nmsFlags.resize((int)num_Corners);
|
||||
|
||||
@ -7593,11 +7597,11 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
|
||||
if(lastRow + 1 == currCorner->pt.y)
|
||||
{
|
||||
// find the corner above the current one
|
||||
while( (keypoints[lastRowCorner_ind].pt.x < currCorner->pt.x)
|
||||
&& (keypoints[lastRowCorner_ind].pt.y == lastRow) )
|
||||
while( (kpts[lastRowCorner_ind].pt.x < currCorner->pt.x)
|
||||
&& (kpts[lastRowCorner_ind].pt.y == lastRow) )
|
||||
lastRowCorner_ind++;
|
||||
|
||||
if( (keypoints[lastRowCorner_ind].pt.x == currCorner->pt.x)
|
||||
if( (kpts[lastRowCorner_ind].pt.x == currCorner->pt.x)
|
||||
&& (lastRowCorner_ind != curr_idx) )
|
||||
{
|
||||
size_t w = lastRowCorner_ind;
|
||||
@ -7605,7 +7609,7 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
|
||||
while(nmsFlags[w] != -1)
|
||||
w = nmsFlags[w];
|
||||
|
||||
if(keypoints[curr_idx].response < keypoints[w].response)
|
||||
if(kpts[curr_idx].response < kpts[w].response)
|
||||
nmsFlags[curr_idx] = (int)w;
|
||||
else
|
||||
nmsFlags[w] = (int)curr_idx;
|
||||
@ -7614,8 +7618,8 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
|
||||
|
||||
// check left
|
||||
t = (int)curr_idx - 1;
|
||||
if( (curr_idx != 0) && (keypoints[t].pt.y == currCorner->pt.y)
|
||||
&& (keypoints[t].pt.x + 1 == currCorner->pt.x) )
|
||||
if( (curr_idx != 0) && (kpts[t].pt.y == currCorner->pt.y)
|
||||
&& (kpts[t].pt.x + 1 == currCorner->pt.x) )
|
||||
{
|
||||
int currCornerMaxAbove_ind = nmsFlags[curr_idx];
|
||||
// find the maximum in that area
|
||||
@ -7626,7 +7630,7 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
|
||||
{
|
||||
if((size_t)t != curr_idx)
|
||||
{
|
||||
if ( keypoints[curr_idx].response < keypoints[t].response )
|
||||
if ( kpts[curr_idx].response < kpts[t].response )
|
||||
nmsFlags[curr_idx] = t;
|
||||
else
|
||||
nmsFlags[t] = (int)curr_idx;
|
||||
@ -7636,7 +7640,7 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
|
||||
{
|
||||
if(t != currCornerMaxAbove_ind)
|
||||
{
|
||||
if(keypoints[currCornerMaxAbove_ind].response < keypoints[t].response)
|
||||
if(kpts[currCornerMaxAbove_ind].response < kpts[t].response)
|
||||
{
|
||||
nmsFlags[currCornerMaxAbove_ind] = t;
|
||||
nmsFlags[curr_idx] = t;
|
||||
@ -7652,19 +7656,15 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
|
||||
currCorner++;
|
||||
}
|
||||
|
||||
// marks non-maximum corners
|
||||
// collecting maximum corners
|
||||
for(curr_idx = 0; curr_idx < num_Corners; curr_idx++)
|
||||
{
|
||||
if (nmsFlags[curr_idx] != -1)
|
||||
keypoints[curr_idx].response = -1;
|
||||
}
|
||||
|
||||
// erase non-maximum corners
|
||||
for (j = keypoints.size(); j > 0; j--)
|
||||
{
|
||||
if (keypoints[j - 1].response == -1)
|
||||
keypoints.erase(keypoints.begin() + j - 1 );
|
||||
if (nmsFlags[curr_idx] == -1)
|
||||
keypoints.push_back(kpts[curr_idx]);
|
||||
}
|
||||
} else
|
||||
{
|
||||
keypoints = kpts;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user