Необработанное исключение в 0x00007FF74F27A526 в OpenARK-SDK.exe: 0xC00000FD: переполнение стека (параметры: 0x0000000000000001, 0x000000EEC5803FD8)

голоса
-2

Следующий фрагмент кода вызывает StackOverflow.

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

Как я могу это исправить? Она является частью хранилища с открытым исходным кодом я способствующий , и я надеюсь , что не делать серьезные изменений здесь:

/***
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 исключение происходит. введите

Вот скриншот стека вызовов: введите

Вот скринкаст меня пытаются run without debuggingэто.

Задан 01/06/2017 в 02:41
источник пользователем
На других языках...                            


2 ответов

голоса
3

Концовка условия для вашей рекурсии являются неполными или неверными.

Если вы посмотрите на заливка, два случая возврата и один вызывает рекурсию. Это говорит нам блок рекурсии неверен. В частности, что closeEnough () не работает по назначению, так как вы вызвали случай, который никогда не возвращает истину.

Вы бы взглянуть на переменные передается в closeEnough, чтобы понять, почему они не удовлетворяют его. Просто глядя на код, который я могу сказать, что это никогда не верно для случая, когда переполнение стека:

  if (num_close >= num_neighbors) {

Я мог бы догадаться, какие условия не выполняются, но вы можете сделать это гораздо легче, глядя на значения, передаваемых в closeEnough.

Если этого не достаточно, пожалуйста, дайте нам значение.

Ответил 01/06/2017 в 03:37
источник пользователем

голоса
1

Хотя я думаю, что это не лучший способ пойти об этом, по крайней мере, это исправить в моем случае. введите описание изображения здесь

Не стесняйтесь поделиться другие ответы.

Ответил 01/06/2017 в 05:41
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more