【问题标题】:c++ flood fill image recursive algorithm errorc++洪水填充图像递归算法错误
【发布时间】:2013-06-27 21:37:04
【问题描述】:

我正在编写一个填充方法来用红色填充图像(狗的轮廓)。

在我的 TestShellDlg.cpp 中是洪水填充方法。 CTestShellDlg::m_pScreenDib 成员是包含图形并绘制它们的 CDIB32 位图类。

我想对当前像素进行采样,如果它不是黑色(轮廓的颜色),则将其着色为红色。这是 Dib32.cpp 类中预构建的 getter:

void CDIB32::GetRGB(int x, int y, BYTE& r, BYTE& g, BYTE& b)
{
    if (x >= Width() || y >= Height())
        IERROR;

    int off = y * ByteWid() + x * 4;
    b = m_pBits[off];
    g = m_pBits[off+1];
    r = m_pBits[off+2];
}

这是我在 TestShellDlg.cpp 类中的 Floodfill 方法:

void CTestShellDlg::FloodFill(CPoint& mid)
{
    byte r,g,b;
    //while the current pixel colour is not black, set it to red and recursively loop
    m_pScreenDib ->GetRGB(mid.x,mid.y, (byte) r,(byte) g,(byte)b);
        while(r !=(byte)0, g !=(byte)0, b !=(byte)0)
        {
            m_pScreenDib -> SetRGB(mid.x, mid.y,(byte)255,(byte) 0,(byte) 0);
            mid.x++;
            FloodFill(mid);
            mid.x--;
            FloodFill(mid);
            mid.y++;
            FloodFill(mid);
            mid.y--;
            FloodFill(mid);
        }

}

在构建和运行项目时,我在 GetRGB() 函数的 IERROR 处得到一个断点。

在堆栈中工作,这发生在 mid.x - 经过几次运行之后。该程序似乎永远无法进入 mid.y++。

我也试过这个作为我的停止条件:

while(mid.x < m_pScreenDib ->Width() && mid.y < m_pScreenDib -> Height())

结果相同。

蜂巢思维中的任何人都可以提供原因和可能的解决方案吗?非常感谢大家。

【问题讨论】:

  • 堆栈溢出?请记住,函数调用在堆栈上分配内存,并且堆栈是有限的。你使用递归吗?
  • 好的,谢谢。不,我不必使用递归。这只是我确保覆盖每个像素的方法。我想我将不得不采取不同的策略。谢谢。

标签: c++ visual-c++ flood-fill


【解决方案1】:

有几个问题。先修复这些,看看会发生什么:

  1. 您正在递归调用FloodFill,而rgb 并不都等于0。但是您不会在while 循环中更新这些值中的任何一个。这会给你一个无限循环。

  2. 这里还有一个问题:

        mid.x++;
        FloodFill(mid);
        mid.x--;
        FloodFill(mid);
    

    让 x 为 100。在mid.x++ 之后,x 将是 101。然后您执行x--,再次留下 x=100。因此,您使用相同的 x 值递归调用 FloodFill()。我不认为那是你的本意。

  3. FloodFill 中,在再次调用FloodFill 之前增加x。但是您不检查是否已到达图像的右边界,因此FloodFill 将被递归调用,并使用更大的x 值,直到您获得堆栈溢出、访问冲突或设置x由于整数溢出(无论先发生什么),年龄为 0。

【讨论】:

  • 嗯,谢谢!不过,在第 1 点上,我不是用这条线更改像素值吗:code m_pScreenDib -&gt; SetRGB(mid.x, mid.y,(byte)255,(byte) 0,(byte) 0);
  • @RyanRDizzleGraham 是的,您可以更改像素值,但不会更改 变量 rgb
  • 所以还要同时设置为 r= 255, g =0, b=0?
  • @RyanRDizzleGraham 在这种情况下,您实际上不需要循环。
猜你喜欢
  • 2014-02-16
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多