@@ -1532,7 +1532,7 @@ ccv_icf_classifier_cascade_t* ccv_icf_classifier_cascade_new(ccv_array_t* posfil
15321532 return z .classifier ;
15331533}
15341534
1535- void ccv_icf_classifier_cascade_soft (ccv_icf_classifier_cascade_t * cascade , ccv_array_t * posfiles , const char * dir , double acceptance )
1535+ void ccv_icf_classifier_cascade_soft (ccv_icf_classifier_cascade_t * cascade , ccv_array_t * posfiles , double acceptance )
15361536{
15371537 printf ("with %d positive examples\n"
15381538 "going to accept %.2lf%% positive examples\n" ,
@@ -1798,7 +1798,7 @@ static void _ccv_icf_detect_objects_with_classifier_cascade(ccv_dense_matrix_t*
17981798 {
17991799 ccv_comp_t comp ;
18001800 comp .rect = ccv_rect ((int )((x + 0.5 ) * scale * (1 << i ) - 0.5 ), (int )((y + 0.5 ) * scale * (1 << i ) - 0.5 ), (cascade -> size .width - cascade -> margin .left - cascade -> margin .right ) * scale * (1 << i ), (cascade -> size .height - cascade -> margin .top - cascade -> margin .bottom ) * scale * (1 << i ));
1801- comp .id = j ;
1801+ comp .id = j + 1 ;
18021802 comp .neighbors = 1 ;
18031803 comp .confidence = sum ;
18041804 ccv_array_push (seq [j ], & comp );
@@ -1905,7 +1905,7 @@ static void _ccv_icf_detect_objects_with_multiscale_classifier_cascade(ccv_dense
19051905 {
19061906 ccv_comp_t comp ;
19071907 comp .rect = ccv_rect ((int )((x + 0.5 ) * scale * (1 << i )), (int )((y + 0.5 ) * scale * (1 << i )), (cascade -> size .width - cascade -> margin .left - cascade -> margin .right ) << i , (cascade -> size .height - cascade -> margin .top - cascade -> margin .bottom ) << i );
1908- comp .id = j ;
1908+ comp .id = j + 1 ;
19091909 comp .neighbors = 1 ;
19101910 comp .confidence = sum ;
19111911 ccv_array_push (seq [j ], & comp );
@@ -1987,31 +1987,55 @@ ccv_array_t* ccv_icf_detect_objects(ccv_dense_matrix_t* a, void* cascade, int co
19871987 ccv_array_push (seq2 , comps + i );
19881988 }
19891989
1990+ // filter out large object rectangles contains small object rectangles
1991+ for (i = 0 ; i < seq2 -> rnum ; i ++ )
1992+ {
1993+ ccv_comp_t * r2 = (ccv_comp_t * )ccv_array_get (seq2 , i );
1994+ int distance = (int )(ccv_min (r2 -> rect .width , r2 -> rect .height ) * 0.25 + 0.5 );
1995+ for (j = 0 ; j < seq2 -> rnum ; j ++ )
1996+ {
1997+ ccv_comp_t r1 = * (ccv_comp_t * )ccv_array_get (seq2 , j );
1998+ if (i != j &&
1999+ abs (r1 .id ) == r2 -> id &&
2000+ r1 .rect .x >= r2 -> rect .x - distance &&
2001+ r1 .rect .y >= r2 -> rect .y - distance &&
2002+ r1 .rect .x + r1 .rect .width <= r2 -> rect .x + r2 -> rect .width + distance &&
2003+ r1 .rect .y + r1 .rect .height <= r2 -> rect .y + r2 -> rect .height + distance &&
2004+ // if r1 (the smaller one) is better, mute r2
2005+ (r2 -> confidence <= r1 .confidence && r2 -> neighbors < r1 .neighbors ))
2006+ {
2007+ r2 -> id = - r2 -> id ;
2008+ break ;
2009+ }
2010+ }
2011+ }
2012+
19902013 // filter out small object rectangles inside large object rectangles
19912014 for (i = 0 ; i < seq2 -> rnum ; i ++ )
19922015 {
1993- ccv_root_comp_t r1 = * (ccv_root_comp_t * )ccv_array_get (seq2 , i );
2016+ ccv_comp_t r1 = * (ccv_comp_t * )ccv_array_get (seq2 , i );
19942017 int flag = 1 ;
19952018
19962019 for (j = 0 ; j < seq2 -> rnum ; j ++ )
19972020 {
1998- ccv_root_comp_t r2 = * (ccv_root_comp_t * )ccv_array_get (seq2 , j );
2021+ ccv_comp_t r2 = * (ccv_comp_t * )ccv_array_get (seq2 , j );
19992022 int distance = (int )(ccv_min (r2 .rect .width , r2 .rect .height ) * 0.25 + 0.5 );
20002023
20012024 if (i != j &&
2002- r1 .id == r2 .id &&
2025+ abs ( r1 .id ) == abs ( r2 .id ) &&
20032026 r1 .rect .x >= r2 .rect .x - distance &&
20042027 r1 .rect .y >= r2 .rect .y - distance &&
20052028 r1 .rect .x + r1 .rect .width <= r2 .rect .x + r2 .rect .width + distance &&
20062029 r1 .rect .y + r1 .rect .height <= r2 .rect .y + r2 .rect .height + distance &&
2030+ // if r2 is better, we mute r1
20072031 (r2 .confidence > r1 .confidence || r2 .neighbors >= r1 .neighbors ))
20082032 {
20092033 flag = 0 ;
20102034 break ;
20112035 }
20122036 }
20132037
2014- if (flag )
2038+ if (flag && r1 -> id > 0 )
20152039 ccv_array_push (result_seq , & r1 );
20162040 }
20172041 ccv_array_free (idx_seq );
0 commit comments