2017-01-03 67 views
0

我一直在寻找这两天的代码,我不知道发生了什么。OpenCV C++:声明一个新的变量导致堆栈损坏

void filterKeypoints(std::vector<KeyPoint> &keypoints, Mat orientation){ 
    unsigned int rows = orientation.rows; 
    unsigned int cols = orientation.cols; 
    unsigned int N = keypoints.size(); 

    Mat newOrientation; 
    vector<KeyPoint> newKeyPoints; 

    // Function do create n points in a interval equally spaced 
    vector<float> t = divideInterval(-3.14159265, 3.14159265, 6); 

    for (unsigned int i = 0; i < N; i++){ 
     Mat x_c, y_c; 
     getKeyPoint(keypoints[i], x_c, y_c); 

     float radius_sq = (72 * pow(keypoints[i].size, 2)); 
     float radius = 6 * sqrt(2)*keypoints[i].size; 

     float x_min = round(keypoints[i].pt.x - radius); 
     float x_max = round(keypoints[i].pt.x + radius); 
     float y_min = round(keypoints[i].pt.y - radius); 
     float y_max = round(keypoints[i].pt.y + radius); 
     cout << i << " of " << N << endl; 

     if ((x_min >= 0) && (x_max < cols) && (y_min >= 0) && (y_max < rows)){ 

      Mat X, Y; 
      meshGrid(X, Y, x_min, x_max, y_min, y_max); 

      X = X.reshape(0, 1); // row vector 
      Y = Y.reshape(0, 1); 

      int nr = y_max - y_min + 1; 
      int nc = x_max - x_min + 1; 

      Mat D_array = Mat::zeros(128, 1, CV_32FC1); 
      float radius_sq_small = radius_sq/16; 

      //////////// HERE STOPED IMPLEMENTATION 
      for (unsigned int j = 0; j < 16; j++){ 
       Mat X_sq, Y_sq; 
       cv::pow(X - (float) x_c.at<float>(j), 2, X_sq); 
       cv::pow(Y - (float) y_c.at<float>(j), 2, Y_sq); 
       Mat Distance_Square = X_sq + Y_sq; 

       Mat If = Mat::zeros(rows, cols, CV_8UC1); 
       Mat Binary; 
       //cv::compare(Distance_Square, radius_sq_small, Binary, CMP_LE); 

       //Mat Binary = Distance_Square <= radius_sq_small; 
       //Binary = Binary.reshape(0, nr); 
       //Mat roi_img(If(cvRect(x_min, y_min, nc, nr))); 
       //Binary.copyTo(roi_img); 


      } 

     } 

    } 

    cout << "Everything run well." << endl; 
} 

如果在其中创建Mat Binary该行注释掉,该方案打破了未处理的异常:它运行的周期,到达cout和不走出void函数启动一个错误:”。 exe停止工作“。

如果我提交这一行,一切都按预期进行。所以我猜测有一些堆栈损坏,但我不太了解为什么...

注意:该函数尚未实现,但我不知道为什么会引发此错误。

关键点来自opencv sift和orientation是一个梯度方向的图像。我使用的OpenCV 3.1

调用它是原来的功能:

void getImageDescriptors(Mat image, Mat orientation){ 
    cv::Ptr<Feature2D> f2d = xfeatures2d::SIFT::create(); 
    std::vector<KeyPoint> keypoints; 
    f2d->detect(image, keypoints); 
    Mat descriptors; 
    f2d->compute(image, keypoints, descriptors); 

    adjustAngle(keypoints); 
    filterKeypoints(keypoints, orientation); 
    cout << "Got here Correctly" << endl; 
} 

希望有人能帮助我!

最好的问候。

编辑1:

这里的getKeyPoint功能,也相应地适用一些表达式的文章中,我试图实现。它永远不会返回错误,所以我不会从这里来。

void getKeyPoint(KeyPoint keypoint, Mat &x_c, Mat &y_c){ 
    float xc_array[16] = { -1.5, -0.5, 0.5, 1.5, -1.5, -0.5, 0.5, 1.5, -1.5, -0.5, 0.5, 1.5, -1.5, -0.5, 0.5, 1.5 }; 
    x_c = Mat(1, 16, CV_32FC1, &xc_array).clone(); 
    float yc_array[16] = { -1.5, -1.5, -1.5, -1.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 1.5 }; 
    y_c = Mat(1, 16, CV_32FC1, &yc_array).clone(); 

    float SBP = 3 * keypoint.size; 
    float c = cos(keypoint.angle * 3.14159265/180); // Convert to radians 
    float s = sin(keypoint.angle * 3.14159265/180); 

    x_c = SBP*(c*x_c - s*y_c) + keypoint.pt.x; // See this in future 
    y_c = SBP*(s*x_c + c*y_c) + keypoint.pt.y; 
} 

编辑2

通过由Mat Binary = Mat::zeros(Distance_Square.rows, Distance_Square.cols, CV_8UC1);替换Mat Binary;,错误消失(创建,而不是仅仅缺省初始化零矩阵,)。

我的问题是,为什么这个变量搞乱了内存分配,其他的像newOrientation,X_sq,Y_sq没有造成什么麻烦?

+0

getKeyPoint是做什么的? – NathanOliver

+0

你的建筑环境是什么?你如何链接OpenCV库? –

+0

@NathanOliver我用代码编辑了我的答案。它根据我所关注的文章应用了一些表达式,但它在调试中没有出现任何错误。 – TFreitas

回答

0

已解决,感谢大家帮助。基本上,divideInterval函数的所有路径都不会返回一个值,所以当释放内存时它会抛出一个异常。这是我通过的一个愚蠢的执行错误。

不过我不知道为什么有时只会抛出错误。