示例#1
0
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;
}
示例#2
0
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;
}