Speedup AGAST nonmax-suppression.

This commit is contained in:
Balint Cristian 2015-09-26 04:43:07 +03:00
parent 3a3f4038bf
commit fdbed4a473

View File

@ -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) void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, bool nonmax_suppression, int type)
{ {
std::vector<KeyPoint> kpts;
// detect // detect
switch(type) { switch(type) {
case AgastFeatureDetector::AGAST_5_8: case AgastFeatureDetector::AGAST_5_8:
AGAST_5_8(_img, keypoints, threshold); AGAST_5_8(_img, kpts, threshold);
break; break;
case AgastFeatureDetector::AGAST_7_12d: case AgastFeatureDetector::AGAST_7_12d:
AGAST_7_12d(_img, keypoints, threshold); AGAST_7_12d(_img, kpts, threshold);
break; break;
case AgastFeatureDetector::AGAST_7_12s: case AgastFeatureDetector::AGAST_7_12s:
AGAST_7_12s(_img, keypoints, threshold); AGAST_7_12s(_img, kpts, threshold);
break; break;
case AgastFeatureDetector::OAST_9_16: case AgastFeatureDetector::OAST_9_16:
OAST_9_16(_img, keypoints, threshold); OAST_9_16(_img, kpts, threshold);
break; break;
} }
@ -7534,7 +7537,7 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
makeAgastOffsets(pixel_, (int)img.step, type); makeAgastOffsets(pixel_, (int)img.step, type);
std::vector<KeyPoint>::iterator kpt; std::vector<KeyPoint>::iterator kpt;
for(kpt = keypoints.begin(); kpt != keypoints.end(); kpt++) for(kpt = kpts.begin(); kpt != kpts.end(); kpt++)
{ {
switch(type) { switch(type) {
case AgastFeatureDetector::AGAST_5_8: case AgastFeatureDetector::AGAST_5_8:
@ -7555,20 +7558,21 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
break; break;
} }
} }
// suppression // suppression
if(nonmax_suppression) if(nonmax_suppression)
{ {
size_t j; size_t j;
size_t curr_idx; size_t curr_idx;
size_t lastRow = 0, next_lastRow = 0; 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; size_t lastRowCorner_ind = 0, next_lastRowCorner_ind = 0;
std::vector<int> nmsFlags; std::vector<int> nmsFlags;
std::vector<KeyPoint>::iterator currCorner_nms; std::vector<KeyPoint>::iterator currCorner_nms;
std::vector<KeyPoint>::const_iterator currCorner; std::vector<KeyPoint>::const_iterator currCorner;
currCorner = keypoints.begin(); currCorner = kpts.begin();
nmsFlags.resize((int)num_Corners); 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) if(lastRow + 1 == currCorner->pt.y)
{ {
// find the corner above the current one // find the corner above the current one
while( (keypoints[lastRowCorner_ind].pt.x < currCorner->pt.x) while( (kpts[lastRowCorner_ind].pt.x < currCorner->pt.x)
&& (keypoints[lastRowCorner_ind].pt.y == lastRow) ) && (kpts[lastRowCorner_ind].pt.y == lastRow) )
lastRowCorner_ind++; lastRowCorner_ind++;
if( (keypoints[lastRowCorner_ind].pt.x == currCorner->pt.x) if( (kpts[lastRowCorner_ind].pt.x == currCorner->pt.x)
&& (lastRowCorner_ind != curr_idx) ) && (lastRowCorner_ind != curr_idx) )
{ {
size_t w = lastRowCorner_ind; size_t w = lastRowCorner_ind;
@ -7605,7 +7609,7 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
while(nmsFlags[w] != -1) while(nmsFlags[w] != -1)
w = nmsFlags[w]; w = nmsFlags[w];
if(keypoints[curr_idx].response < keypoints[w].response) if(kpts[curr_idx].response < kpts[w].response)
nmsFlags[curr_idx] = (int)w; nmsFlags[curr_idx] = (int)w;
else else
nmsFlags[w] = (int)curr_idx; nmsFlags[w] = (int)curr_idx;
@ -7614,8 +7618,8 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
// check left // check left
t = (int)curr_idx - 1; t = (int)curr_idx - 1;
if( (curr_idx != 0) && (keypoints[t].pt.y == currCorner->pt.y) if( (curr_idx != 0) && (kpts[t].pt.y == currCorner->pt.y)
&& (keypoints[t].pt.x + 1 == currCorner->pt.x) ) && (kpts[t].pt.x + 1 == currCorner->pt.x) )
{ {
int currCornerMaxAbove_ind = nmsFlags[curr_idx]; int currCornerMaxAbove_ind = nmsFlags[curr_idx];
// find the maximum in that area // 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((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; nmsFlags[curr_idx] = t;
else else
nmsFlags[t] = (int)curr_idx; 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(t != currCornerMaxAbove_ind)
{ {
if(keypoints[currCornerMaxAbove_ind].response < keypoints[t].response) if(kpts[currCornerMaxAbove_ind].response < kpts[t].response)
{ {
nmsFlags[currCornerMaxAbove_ind] = t; nmsFlags[currCornerMaxAbove_ind] = t;
nmsFlags[curr_idx] = t; nmsFlags[curr_idx] = t;
@ -7652,19 +7656,15 @@ void AGAST(InputArray _img, std::vector<KeyPoint>& keypoints, int threshold, boo
currCorner++; currCorner++;
} }
// marks non-maximum corners // collecting maximum corners
for(curr_idx = 0; curr_idx < num_Corners; curr_idx++) for(curr_idx = 0; curr_idx < num_Corners; curr_idx++)
{ {
if (nmsFlags[curr_idx] != -1) if (nmsFlags[curr_idx] == -1)
keypoints[curr_idx].response = -1; keypoints.push_back(kpts[curr_idx]);
}
// erase non-maximum corners
for (j = keypoints.size(); j > 0; j--)
{
if (keypoints[j - 1].response == -1)
keypoints.erase(keypoints.begin() + j - 1 );
} }
} else
{
keypoints = kpts;
} }
} }