OpenARK-SDK.exe中0x00007FF74F27A526处的未处理异常:0xC00000FD:堆栈溢出(参数:0x0000000000000001,0x000000EEC5803FD8)

时间:2017-06-01 03:41:36

标签: c++ opencv exception stack-overflow opencv3.0

以下代码段导致stackoverflow。

Unhandled exception at 0x00007FF74F27A526 in OpenARK-SDK.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x000000EEC5803FD8).

我该如何解决?这是我正在做出贡献的open-source repository的一部分,我希望不要在这里做出重大改变:

/***
Recursively performs floodfill on depthMap
***/
void DepthCamera::floodFill(int x, int y, cv::Mat& depthMap, cv::Mat& mask, double max_distance)
{
    if (x < 0 || x >= depthMap.cols || y < 0 || y >= depthMap.rows || depthMap.at<cv::Vec3f>(y, x)[2] == 0.0)
        return;
    if (closeEnough(x, y, depthMap, 4, max_distance)) {
        mask.at<cv::Vec3f>(y, x) = depthMap.at<cv::Vec3f>(y, x);
        depthMap.at<cv::Vec3f>(y, x)[0] = 0;
        depthMap.at<cv::Vec3f>(y, x)[1] = 0;
        depthMap.at<cv::Vec3f>(y, x)[2] = 0;
    }
    else {
        return;
    }

    floodFill(x + 1, y, depthMap, mask, max_distance);
    floodFill(x - 1, y, depthMap, mask, max_distance);
    floodFill(x, y + 1, depthMap, mask, max_distance);
    floodFill(x, y - 1, depthMap, mask, max_distance);
}

/***
Check whether candidate point is close enough to neighboring points
***/
bool DepthCamera::closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance)
{
    int num_close = 0;
    if (x - 1 < 0 || depthMap.at<cv::Vec3f>(y, x - 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x - 1)) < max_distance) {
        num_close++;
    }
    if (x + 1 >= depthMap.cols || depthMap.at<cv::Vec3f>(y, x + 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x + 1)) < max_distance) {
        num_close++;
    }
    if (y - 1 < 0 || depthMap.at<cv::Vec3f>(y - 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y - 1, x)) < max_distance) {
        num_close++;
    }
    if (y + 1 >= depthMap.rows || depthMap.at<cv::Vec3f>(y + 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y + 1, x)) < max_distance) {
        num_close++;
    }

    if (num_close >= num_neighbors) {
        return true;
    }

    return false;
}

double Util::euclidianDistance3D(cv::Vec3f pt1, cv::Vec3f pt2)
{
    double dx = pt1[0] - pt2[0];
    double dy = pt1[1] - pt2[1];
    double dz = pt1[2] - pt2[2];

    return sqrtf(dx*dx + dy*dy + dz*dz);
}

它被称为:

void DepthCamera::computeClusters(double max_distance, double min_size)
{
    clusters.clear();
    cv::Mat depthMap = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
    cv::medianBlur(xyzMap, depthMap, 3);
    cv::Mat mask = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
    for (int r = depthMap.rows - 1; r >= 0; r--) {
        for (int c = 0; c < depthMap.cols; c++) {
            if (depthMap.at<cv::Vec3f>(r, c)[2] > 0.2) {
                mask = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
                floodFill(c, r, depthMap, mask, max_distance);
                cv::Mat channels[3];
                cv::split(mask, channels);
                if (cv::countNonZero(channels[2]) > min_size) {
                    cv::medianBlur(mask, mask, 3);
                    clusters.push_back(mask.clone());
                }
            }
        }
    }
}

如果需要进一步的信息,请告诉我。基本上,当我靠近相机时,会发生stackoverflow异常。 enter image description here

这里是callstack的屏幕截图: enter image description here

screencast试图run without debugging尝试import java.util.Scanner; class abc{ public static void main(String a[]) { Scanner sc = new Scanner(System.in); int t = Integer.parseInt(sc.next()); int scount=0,mcount=0; while(t!=0) { scount=0; mcount=0; String str=sc.next(); for(int i=0;i<str.length();i++) { if(str.charAt(i)=='m') { mcount++; if(i==0) { if(str.charAt(1)=='s') scount--; } else if(i==(str.length()-1)) { if(str.charAt(i-1)=='s') scount--; } else if(str.charAt(i-1)=='s') scount--; else if (str.charAt(i+1)=='s') scount--; } else if(str.charAt(i)=='s') scount++; } if(scount==mcount) System.out.println("tie"); else if(scount>mcount) System.out.println("snakes"); else System.out.println("mongooses"); t--; } } }

2 个答案:

答案 0 :(得分:3)

递归的结束条件不完整或不正确。

如果你看洪水填充,两个案例返回,一个触发递归。这告诉我们递归块是不正确的。具体来说,closeEnough()没有按预期工作,因为你已经触发了永远不会返回true的案例。

你会看到传递给closeEnough的变量,看看为什么它们永远不会满足它。只看代码我就可以知道堆栈溢出的情况永远不会发生:

  if (num_close >= num_neighbors) {

我可以猜测哪些条件没有得到满足,但是你可以通过查看传递给closeEnough的值来更轻松地做到这一点。

如果还不够,请告诉我们价值观。

答案 1 :(得分:1)

虽然我认为这不是最好的方法,但至少在我的情况下这是一个解决方法。 enter image description here

随意分享其他答案。