if( !history || (history->size != size && size > 0 &&
(gray_level != history->val || force)))
{
- CompHistory* h = hptr++;
- h->parent_ = 0;
- h->child_ = history;
- h->next_ = 0;
- if( history )
- history->parent_ = h;
+ CompHistory* h;
+
+ if (history && gray_level == history->val)
+ h = history;
+ else
+ {
+ h = hptr++;
+ h->parent_ = 0;
+ h->child_ = history;
+ h->next_ = 0;
+ if (history)
+ history->parent_ = h;
+ }
+
h->val = gray_level;
h->size = size;
h->head = head;
history = h;
h->var = FLT_MAX;
h->checked = true;
- if( h->size >= wp.p.minArea )
+ if (h->size >= wp.p.minArea)
{
h->var = -1.f;
h->checked = false;
}
}
gray_level = new_gray_level;
- if( update && history )
+ if( update && history && gray_level != history->val )
history->updateTree(wp, 0, 0, final);
}
void merge( ConnectedComp* comp1, ConnectedComp* comp2,
CompHistory*& hptr, WParams& wp )
{
- comp1->growHistory( hptr, wp, -1, false );
- comp2->growHistory( hptr, wp, -1, false );
-
if( comp1->size < comp2->size )
std::swap(comp1, comp2);
if( comp2->size == 0 )
{
+ // only grow comp1's history
+ comp1->growHistory(hptr, wp, -1, false);
gray_level = comp1->gray_level;
head = comp1->head;
tail = comp1->tail;
return;
}
- CompHistory* h1 = comp1->history;
- CompHistory* h2 = comp2->history;
+ comp1->growHistory( hptr, wp, -1, false );
+ comp2->growHistory( hptr, wp, -1, false );
+
+ if (comp1->gray_level < comp2->gray_level)
+ std::swap(comp1, comp2);
- gray_level = std::max(comp1->gray_level, comp2->gray_level);
+ gray_level = comp1->gray_level;
history = comp1->history;
wp.pix0[comp1->tail].setNext(comp2->head);
head = comp1->head;
tail = comp2->tail;
size = comp1->size + comp2->size;
- bool keep_2nd = h2->size > wp.p.minArea;
- growHistory( hptr, wp, -1, false, keep_2nd );
- if( keep_2nd )
+
+ CompHistory *h1 = history->child_;
+ CompHistory *h2 = comp2->history;
+ if (h2->size > wp.p.minArea)
{
- h1->next_ = h2;
+ // the child_'s size should be the large one
+ if (h1 && h1->size > h2->size)
+ {
+ h2->next_ = h1->next_;
+ h1->next_ = h2;
+ }
+ else
+ {
+ history->child_ = h2;
+ h2->next_ = h1;
+ }
h2->parent_ = history;
}
}