以下代碼片段導致stackoverflow。OpenARK-SDK.exe中的0x00007FF74F27A526未處理的異常:0xC00000FD:堆棧溢出(參數:0x0000000000000001,0x000000EEC5803FD8)
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異常。
這裏是我的一個screencast試圖run without debugging
它。
你能看看堆棧跟蹤嗎?堆棧溢出通常是過度遞歸或過度分配。逐級上升,看看那些看起來不對的變量。 –
@DaveS我添加了callstack的屏幕截圖。請看一看。 –
@MonaJalal - 應該很明顯的是,你再次調用函數,一次又一次地重新執行,導致堆棧溢出。你的遞歸不會結束,你需要弄清楚爲什麼你的邏輯永遠不會放棄它。 – PaulMcKenzie