none
請問當執行影像處理的Seed Region Growing演算法偶爾會發生stack overflow該如何解決? RRS feed

  • 問題

  • 大家好:

        小弟有個case必須要用到區塊成長法

        可是偶爾執行結果正常

        偶爾會發生stack overflow的問題

        該如何解決?

        如何調大stack的size?

    Boolean SRGCompare2(const Int16 %YIndex,
              const Int16 %XIndex,
              HsErrorInfo ^%ErrorInfo)
      {
       // (Y - 1, X)
       if ((0 <= (YIndex - 1) && (YIndex - 1) < m_Height) &&
        (0 <= (XIndex) && (XIndex) < m_Width))
       {
           if (m_SeedOriginalGroupIndex == m_IndexImg[(YIndex - 1), (XIndex)])
        {
            m_IndexImg[(YIndex - 1), (XIndex)] = m_TargetGroupIndex;
                        if (!SRGCompare2((YIndex - 1), (XIndex), ErrorInfo))
          return false;
        } // if
       } // if

       // (Y, X - 1)
       if ((0 <= (YIndex) && (YIndex) < m_Height) &&
        (0 <= (XIndex - 1) && (XIndex - 1) < m_Width))
       {
           if (m_SeedOriginalGroupIndex == m_IndexImg[(YIndex), (XIndex - 1)])
        {
            m_IndexImg[(YIndex), (XIndex - 1)] = m_TargetGroupIndex;
                        if (!SRGCompare2((YIndex), (XIndex - 1), ErrorInfo))
          return false;
        } // if
       } // if
               
       // (Y, X + 1)
       if ((0 <= (YIndex) && (YIndex) < m_Height) &&
        (0 <= (XIndex + 1) && (XIndex + 1) < m_Width))
       {
           if (m_SeedOriginalGroupIndex == m_IndexImg[(YIndex), (XIndex + 1)])
        {
            m_IndexImg[(YIndex), (XIndex + 1)] = m_TargetGroupIndex;
                        if (!SRGCompare2((YIndex), (XIndex + 1), ErrorInfo))
          return false;
        } // if
       } // if

                // (Y + 1, X)
       if ((0 <= (YIndex + 1) && (YIndex + 1) < m_Height) &&
        (0 <= (XIndex) && (XIndex) < m_Width))
       {
           if (m_SeedOriginalGroupIndex == m_IndexImg[(YIndex + 1), (XIndex)])
        {
            m_IndexImg[(YIndex + 1), (XIndex)] = m_TargetGroupIndex;
                        if (!SRGCompare2((YIndex + 1), (XIndex), ErrorInfo))
          return false;
        } // if
       } // if
               
       return true;
      } // SRGCompare2

    2006年6月26日 上午 09:11

解答

  • 應該是你遞回深度太多造成。

    把你的引數用傳址呼叫,把你的變數放到公用變數,這樣可以減少被推到堆積區的變數量,就不容易爆。

    一般講遞回的書應該都有寫。

    2006年6月26日 下午 01:57
    版主

所有回覆

  • 應該是你遞回深度太多造成。

    把你的引數用傳址呼叫,把你的變數放到公用變數,這樣可以減少被推到堆積區的變數量,就不容易爆。

    一般講遞回的書應該都有寫。

    2006年6月26日 下午 01:57
    版主
  • 感謝回覆:

        的確是遞迴深度的問題

        原本的寫法會在整個區域裡亂竄

        當連通的pixel多到一定程度時

        就會stack over flow

        實測約5000層

        這樣就不具實用性

        後來改成動態變更區域外包的範圍去遞迴

        就不再發生stack over flow的問題

        實測一個區域大小在1280 * 1024時依然work

        請問有人知道比較大的c語言影像處理討論去嗎?

    2006年7月7日 下午 02:20
  • 我对你改动后的方法很困惑,能否将後來改成動態變更區域外包的範圍去遞迴的代码share with us?

    2007年7月26日 下午 12:44
  • 您好:

        因為這程式我已經完成很久.

        所以必須花時間整理一下.

        我會盡快回覆給您.

     

    2007年7月26日 下午 01:00