SylixOS C++ 部署ncnn格式的mtcnn multimap.erase返回void处理

正常来说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++;
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/u012421101/article/details/125430475