提交 fdbed4a4 编写于 作者: B Balint Cristian

Speedup AGAST nonmax-suppression.

上级 3a3f4038
......@@ -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;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册