图像处理错误



我必须使用diblock 在c++中实现由于Adams和Bischof的种子区域生长算法,该算法可以在这里找到http://bit.ly/1nIxphj。图2伪代码

在我使用鼠标选择种子点后,它抛出此消息:在diblook.exe中的0x00416ca0处未处理异常:0xC0000005:访问违反读取位置0x3d2f6e68。

这是函数的代码:

void CDibView::OnLButtonDblClk(UINT nFlags, CPoint point)

{BEGIN_SOURCE_PROCESSING;

int** labels = new int* [dwHeight];
for(int k = 0;k < dwHeight; k++)
    labels[k] = new int[dwWidth];
int noOfRegions = 2;
double meanRegion[2];
double noOfPointsInRegion[2];
for(int i = 0; i < dwHeight ; i++)
    for(int j = 0; j < dwWidth ; j++)
    {
        labels[i][j] = -1;
    }


if(noOfPoints < 6)
{
    CPoint p = GetScrollPosition() + point;
    pos[noOfPoints].x = p.x;
    pos[noOfPoints].y = p.y;
    int regionLabel = 0;
    if(noOfPoints <= noOfPoints / 2)
        labels[p.x][p.y] = regionLabel;
    else 
        labels[p.x][p.y] = regionLabel + 1;
    noOfPoints++;
}
else
{
    // Calculate the mean of each region
    for(int i = 0; i < noOfRegions; i++)
    {
        for(int j = 0 ; j < noOfPoints; j++)
        {
            if(labels[pos[j].x][pos[j].y] == i)
            {
                meanRegion[i] += lpSrc[pos[j].x * w + pos[j].y];
            }
        }
        meanRegion[i] /= 3;
        noOfPointsInRegion[i] = 3;
    }
    for(int seedPoint = 0; seedPoint < noOfPoints; seedPoint++)
    {
        // define list
        node *start, *temp;
        start = (node *) malloc (sizeof(node));
        temp = start;
        temp -> next = NULL;

        for(int i = -1; i <= 1; i++)
            for(int j = -1; j<= 1; j++)
            {
                if(i == 0 && j == 0) continue;
                int gamma = lpSrc[(pos[seedPoint].x + i) *  + pos[seedPoint].y + j] - lpSrc[pos[seedPoint].x * w + pos[seedPoint].y];
                push(start, pos[seedPoint].x + i, pos[seedPoint].y + j, gamma);

            }
        sort(start);
        if(start != NULL)
        {
            node *y = start; 
            pop(start);
            int sameNeighbour = 1;
            int neighValue = -1;
            for(int k = -1; k <= 1; k++)
                for(int l = -1; l <= 1;l++)
                {
                    if(k ==0 && l==0) continue;
                    if(labels[y -> x + k][y -> y + l] != -1)
                    {
                        neighValue = labels[y -> x + k][y -> y + l];
                        break;
                    }
                }
                for(int k = -1; k <= 1; k++)
                    for(int l = -1; l <= 1;l++)
                    {
                        if(k == 0 && l==0) continue;
                        if(labels[y -> x + k][y -> y = 1] != -1 && labels[y -> x + k][y -> y + l] != neighValue)
                            sameNeighbour = 0;
                    }
                    if(sameNeighbour == 1)
                    {
                        labels[y -> x][y -> y] = neighValue;
                        meanRegion[neighValue] = meanRegion[neighValue] * noOfPointsInRegion[neighValue] / noOfPointsInRegion[neighValue] + 1;
                        noOfPointsInRegion[neighValue]++;
                        for(int k = -1; k <= 1; k++)
                            for(int l = -1; l <= 1;l++)
                            {
                                if(k == 0 && l == 0) continue;
                                if(labels[y -> x + k][y -> y + l] == -1 && find(start, y->x + k, y->y + l) == 0)
                                {
                                    int gammak = meanRegion[neighValue] - lpSrc[(y->x +k) * w + (y->y + l)];
                                    push(start, y->x + k, y->y + l, gammak);
                                    sort(start);
                                }
                            }
                    }
                    else
                    {
                        labels[y->x][y->y] = -1;
                    }
        }
    }

    int noOfRegionOne = 0;
    int noOfRegionTwo = 0;
    int noOfBoundary = 0;
    for(int i = 0; i< dwHeight; i++)
        for(int j = 0;j<dwWidth; j++)
        {
            if(labels[i][j] == -1)
                noOfBoundary++;
            else if(labels[i][j] == 0)
                noOfRegionOne++;
            else if(labels[i][j] == 1)
                noOfRegionTwo++;
        }
        CString info;
        info.Format("Boundary %d, One %d, Two %d", noOfBoundary, noOfRegionOne, noOfRegionTwo);
        AfxMessageBox(info);
    noOfPoints = 0;
}
CScrollView::OnLButtonDblClk(nFlags, point);

END_SOURCE_PROCESSING;

}

选择中断运行后,如下所示http://postimg.org/image/j2sh9k0a1/

有谁能告诉我出了什么问题,为什么它不起作用?谢谢。

您的屏幕截图显示您的节点(顺便说一句,Y是一个糟糕的名称)中有垃圾值。随便说一句,我怀疑"sort"覆盖了节点值,导致了垃圾。我将创建当前节点的静态副本,以防止它在处理过程中更改:

改变
    node *y = start; 
    pop(start);

    node y = *start; 
    pop(start);

最新更新