[opencv] 78/251: Merge pull request #8910 from gylns:mser

Nobuhiro Iwamatsu iwamatsu at moszumanska.debian.org
Sun Aug 27 23:27:28 UTC 2017


This is an automated email from the git hooks/post-receive script.

iwamatsu pushed a commit to annotated tag 3.3.0
in repository opencv.

commit 6d1cdcf6011d69aad81add2fb4d47b3520ae659b
Author: gylns <gylpm at 163.com>
Date:   Fri Jul 14 11:58:56 2017 -0500

    Merge pull request #8910 from gylns:mser
    
    fix the MSER history's size issue (#8910)
    
    * simplify growHistory and merge
    
    * add assertion for history's size
    
    * MSER: fix merging components' history
---
 modules/features2d/src/mser.cpp | 141 +++++++++++++++++++---------------------
 1 file changed, 67 insertions(+), 74 deletions(-)

diff --git a/modules/features2d/src/mser.cpp b/modules/features2d/src/mser.cpp
index 89083d0..9f4a4ca 100755
--- a/modules/features2d/src/mser.cpp
+++ b/modules/features2d/src/mser.cpp
@@ -262,98 +262,95 @@ public:
         }
 
         // add history chunk to a connected component
-        void growHistory( CompHistory*& hptr, WParams& wp, int new_gray_level, bool final, bool force=false )
+        void growHistory(CompHistory*& hptr, WParams& wp, int new_gray_level, bool final)
         {
-            bool update = final;
-            if( new_gray_level < 0 )
+            if (new_gray_level < gray_level)
                 new_gray_level = gray_level;
-            if( !history || (history->size != size && size > 0 &&
-                (gray_level != history->val || force)))
-            {
-                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;
+            CompHistory *h;
+            if (history && history->val == gray_level)
+            {
+                h = history;
+            }
+            else
+            {
+                h = hptr++;
+                h->parent_ = 0;
+                h->child_ = history;
+                h->next_ = 0;
 
-                history = h;
-                h->var = FLT_MAX;
-                h->checked = true;
-                if (h->size >= wp.p.minArea)
+                if (history)
                 {
-                    h->var = -1.f;
-                    h->checked = false;
-                    update = true;
+                    history->parent_ = h;
                 }
             }
+            h->val = gray_level;
+            h->size = size;
+            h->head = head;
+            h->var = FLT_MAX;
+            h->checked = true;
+            if (h->size >= wp.p.minArea)
+            {
+                h->var = -1.f;
+                h->checked = false;
+            }
+
             gray_level = new_gray_level;
-            if( update && history && gray_level != history->val )
+            history = h;
+            if (history && history->val != gray_level)
+            {
                 history->updateTree(wp, 0, 0, final);
+            }
         }
 
         // merging two connected components
         void merge( ConnectedComp* comp1, ConnectedComp* comp2,
                     CompHistory*& hptr, WParams& wp )
         {
-            if( comp1->size < comp2->size )
+            if (comp1->gray_level < comp2->gray_level)
                 std::swap(comp1, comp2);
 
-            if( comp2->size == 0 )
+            gray_level = comp1->gray_level;
+            comp1->growHistory(hptr, wp, gray_level, false);
+            comp2->growHistory(hptr, wp, gray_level, false);
+
+            if (comp1->size == 0)
+            {
+                head = comp2->head;
+                tail = comp2->tail;
+            }
+            else
             {
-                // only grow comp1's history
-                comp1->growHistory(hptr, wp, -1, false);
-                gray_level = comp1->gray_level;
                 head = comp1->head;
-                tail = comp1->tail;
-                size = comp1->size;
-                history = comp1->history;
-                return;
+                wp.pix0[comp1->tail].setNext(comp2->head);
+                tail = comp2->tail;
             }
 
-            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 = comp1->gray_level;
-            history = comp1->history;
-            wp.pix0[comp1->tail].setNext(comp2->head);
-
-            head = comp1->head;
-            tail = comp2->tail;
             size = comp1->size + comp2->size;
-            // update the history size
-            history->size =size;
+            history = comp1->history;
 
             CompHistory *h1 = history->child_;
             CompHistory *h2 = comp2->history;
-            if (h2->size > wp.p.minArea)
+            // the child_'s size should be the large one
+            if (h1 && h1->size > h2->size)
             {
-                // the child_'s size should be the large one
-                if (h1 && h1->size > h2->size)
+                // add h2 as a child only if its size is large enough
+                if(h2->size >= wp.p.minArea)
                 {
                     h2->next_ = h1->next_;
                     h1->next_ = h2;
+                    h2->parent_ = history;
                 }
-                else
+            }
+            else
+            {
+                history->child_ = h2;
+                h2->parent_ = history;
+                // reserve h1 as a child only if its size is large enough
+                if (h1 && h1->size >= wp.p.minArea)
                 {
-                    history->child_ = h2;
                     h2->next_ = h1;
                 }
-                h2->parent_ = history;
             }
         }
 
@@ -517,30 +514,26 @@ public:
                 ptr = *heap[curr_gray];
                 heap[curr_gray]--;
 
-                if( curr_gray < comptr[-1].gray_level )
+                if (curr_gray < comptr[-1].gray_level)
+                {
                     comptr->growHistory(histptr, wp, curr_gray, false);
+                    CV_DbgAssert(comptr->size == comptr->history->size);
+                }
                 else
                 {
-                    // keep merging top two comp in stack until the gray level >= pixel_val
-                    for(;;)
-                    {
-                        comptr--;
-                        comptr->merge(comptr, comptr+1, histptr, wp);
-                        if( curr_gray <= comptr[0].gray_level )
-                            break;
-                        if( curr_gray < comptr[-1].gray_level )
-                        {
-                            comptr->growHistory(histptr, wp, curr_gray, false);
-                            break;
-                        }
-                    }
+                    // there must one pixel with the second component's gray level in the heap,
+                    // so curr_gray is not large than the second component's gray level
+                    comptr--;
+                    CV_DbgAssert(curr_gray == comptr->gray_level);
+                    comptr->merge(comptr, comptr + 1, histptr, wp);
+                    CV_DbgAssert(curr_gray == comptr->gray_level);
                 }
             }
         }
 
         for( ; comptr->gray_level != 256; comptr-- )
         {
-            comptr->growHistory(histptr, wp, 256, true, true);
+            comptr->growHistory(histptr, wp, 256, true);
         }
     }
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/opencv.git



More information about the debian-science-commits mailing list