std::vector<Proposals> boxNms( const std::vector<Proposals> & proposals, const std::vector<int> & order, float max_iou, float min_box_size ) { std::multimap<float,int> area_map; area_map.insert(std::make_pair(0.f,-1)); area_map.insert(std::make_pair(1e6f,-1)); std::vector<Vector4i> boxes; for( const Proposals & p: proposals ) { RMatrixXi b = maskToBox( p.s, p.p ); for( int i=0; i<b.rows(); i++ ) boxes.push_back( b.row(i) ); } std::vector<bool> is_good( boxes.size() ); for( int i: order ) { Vector4i b = boxes[i]; float ba = boxArea(b); if (min_box_size > ba) continue; bool overlaps = false; auto i0 = area_map.upper_bound(ba); auto i1 = i0--; while(!overlaps) { if( i1->second >= 0 && ba*ba > i1->first*i0->first && ba > max_iou*i1->first ) { overlaps = boxIou(boxes[i1->second],b) >= max_iou; ++i1; } else if( i0->second >= 0 && ba * max_iou < i0->first ) { overlaps = boxIou(boxes[i0->second],b) >= max_iou; --i0; } else break; } is_good[i] = !overlaps; if( !overlaps ) area_map.insert( std::make_pair(ba,i) ); } std::vector<Proposals> res( proposals.size() ); for( int i=0,k=0; i<proposals.size(); i++ ) { res[i].s = proposals[i].s; std::vector<RowVectorXb> good_p; for( int j=0; j<proposals[i].p.rows(); j++,k++ ) if( is_good[k] ) good_p.push_back( proposals[i].p.row(j) ); res[i].p = RMatrixXb( good_p.size(), proposals[i].p.cols() ); for( int j=0; j<good_p.size(); j++ ) res[i].p.row(j) = good_p[j]; } return res; }
int main() { double a, b, c; unsigned d[] = {1, 22, 3, 44, 5, 1}; double e[] = {1.1, 2.2, 3.3}; char* s = "Jack and Jill."; printf("%lf\n", boxArea(3, 3, 3)); stats(&a, &b, &c, 7, 2, 3); printf("%lf %lf %lf\n", a, b, c); printf("%lf\n", aveOdd(d, 6)); reverse(e, e + 3); printf("%lf %lf %lf\n", e[0], e[1], e[2]); printf("%u\n", howMany('J', s)); return 0; }