正常来说it = vScores.erase(it);
是可以运行的,但我在SylixOS上部署时却出现了返回为void的问题。具体解决是用间接变量法。首先通过it->first
取出Key值,再递增,再删除。
报错代码如下:
while(vScores.size() > 0){
int last = vScores.rbegin()->second;
vPick[nPick] = last;
nPick += 1;
for (multimap<float, int>::iterator it = vScores.begin(); it != vScores.end();){
int it_idx = it->second;
maxX = std::max(boundingBox_.at(it_idx).x1, boundingBox_.at(last).x1);
maxY = std::max(boundingBox_.at(it_idx).y1, boundingBox_.at(last).y1);
minX = std::min(boundingBox_.at(it_idx).x2, boundingBox_.at(last).x2);
minY = std::min(boundingBox_.at(it_idx).y2, boundingBox_.at(last).y2);
//maxX1 and maxY1 reuse
maxX = ((minX-maxX+1)>0)? (minX-maxX+1) : 0;
maxY = ((minY-maxY+1)>0)? (minY-maxY+1) : 0;
//IOU reuse for the area of two bbox
IOU = maxX * maxY;
if(!modelname.compare("Union"))
IOU = IOU/(boundingBox_.at(it_idx).area + boundingBox_.at(last).area - IOU);
else if(!modelname.compare("Min")){
IOU = IOU/((boundingBox_.at(it_idx).area < boundingBox_.at(last).area)? boundingBox_.at(it_idx).area : boundingBox_.at(last).area);
}
if(IOU > overlap_threshold){
multimap<float, int>::iterator t;
if (it != vScores.end()){
it = vScores.erase(it);
}else{
vScores.erase(it);
}
}else{
it++;
}
}
}
解决代码如下:
while(vScores.size() > 0){
int last = vScores.rbegin()->second;
vPick[nPick] = last;
nPick += 1;
float key;
for (multimap<float, int>::iterator it = vScores.begin(); it != vScores.end();){
int it_idx = it->second;
maxX = std::max(boundingBox_.at(it_idx).x1, boundingBox_.at(last).x1);
maxY = std::max(boundingBox_.at(it_idx).y1, boundingBox_.at(last).y1);
minX = std::min(boundingBox_.at(it_idx).x2, boundingBox_.at(last).x2);
minY = std::min(boundingBox_.at(it_idx).y2, boundingBox_.at(last).y2);
//maxX1 and maxY1 reuse
maxX = ((minX-maxX+1)>0)? (minX-maxX+1) : 0;
maxY = ((minY-maxY+1)>0)? (minY-maxY+1) : 0;
//IOU reuse for the area of two bbox
IOU = maxX * maxY;
if(!modelname.compare("Union"))
IOU = IOU/(boundingBox_.at(it_idx).area + boundingBox_.at(last).area - IOU);
else if(!modelname.compare("Min")){
IOU = IOU/((boundingBox_.at(it_idx).area < boundingBox_.at(last).area)? boundingBox_.at(it_idx).area : boundingBox_.at(last).area);
}
if(IOU > overlap_threshold){
multimap<float, int>::iterator t;
if (it != vScores.end()){
key = it->first;
it++;
vScores.erase(vScores.find(key));
}else{
vScores.erase(it);
}
}else{
it++;
}
}
}