/* * call-seq: * insert(<i>index,obj</i>) -> self * * Inserts the given values before element with the given index (which may be negative). */ VALUE rb_insert(VALUE self, VALUE index, VALUE object) { Check_Type(index, T_FIXNUM); CvSeq *seq = CVSEQ(self); VALUE klass = seqblock_class(seq); if(CLASS_OF(object) != klass) rb_raise(rb_eTypeError, "arguments should be %s.", rb_class2name(klass)); cvSeqInsert(seq, FIX2INT(index), DATA_PTR(object)); return self; }
static void doCoalesce(image_session_t *mySession) { CvSeq *newDetected = NULL; image_detected_t *current; CvRect tempRect; int over_left, over_top; int right1, right2, over_right; int bottom1, bottom2, over_bottom; int over_width, over_height; int r1Area, r2Area; int *merged = NULL; int newI = 0; int i, j; uint16_t current_category; for(current_category = 0; current_category < num_image_categories; current_category++) { current = &mySession->detected[current_category]; if(current->category->coalesceOverlap != 1.0f && current->detected) { // Loop the number of detected objects newDetected = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvRect), mySession->lstorage ); merged = malloc(sizeof(int) * current->detected->total); newI = 0; for(i = 0; i < current->detected->total; i++ ) merged[i] = -1; // quickly setup merged variable for(i = 0; i < current->detected->total; i++ ) { CvRect* r = (CvRect*)cvGetSeqElem( current->detected, i ); if(merged[i] == -1) { cvSeqPush( newDetected, r ); merged[i] = newI; newI++; } if(current->detected->total - i > 0) { r1Area = r->width * r->height; for(j = i + 1; j < current->detected->total; j++ ) { // Reset rectangles to original size CvRect* r2 = (CvRect*)cvGetSeqElem( current->detected, j ); r2Area = r2->width * r2->height; right1 = r->x + r->width; right2 = r2->x + r2->width; bottom1 = r->y + r->height; bottom2 = r2->y + r2->height; if (!(bottom1 < r2->y) && !(r->y > bottom2) && !(right1 < r2->x) && !(r->x > right2)) { // Ok, compute the rectangle of overlap: if (bottom1 > bottom2) over_bottom = bottom2; else over_bottom = bottom1; if (r->y < r2->y) over_top = r2->y; else over_top = r->y; if (right1 > right2) over_right = right2; else over_right = right1; if (r->x < r2->x) over_left = r2->x; else over_left = r->x; over_width=over_right-over_left; over_height=over_bottom-over_top; if((r1Area * current->category->coalesceOverlap <= over_width*over_height) || (r2Area * current->category->coalesceOverlap <= over_width*over_height)) { ci_debug_printf(10, "srv_classify_image: Merging detected %s at X: %d, Y: %d, Height: %d, Width: %d and X2: %d, Y2: %d, Height2: %d, Width2: %d\n", current->category->name, r->x, r->y, r->height, r->width, r2->x, r2->y, r2->height, r2->width); tempRect = cvMaxRect( (CvRect*)cvGetSeqElem( newDetected, merged[i] ), r2); cvSeqRemove( newDetected, merged[i] ); cvSeqInsert( newDetected, merged[i], &tempRect ); merged[j] = merged[i]; } } } } } cvClearSeq( current->detected ); current->detected = newDetected; free(merged); } } }