2015-11-16 51 views
0

我目前正在寫一個BLOB檢測算法。當我運行它,我得到的錯誤在blobdetector.exe在0x00007FF70476CDA7未處理的異常。訪問衝突閱讀位置

未處理的異常:0000005:

訪問衝突讀取位置0x0000007BDDA0347D。

這是它打破了代碼的一部分。

調試器停止在最後一行前if(val == 255)

void connectivity(BlobBurnMat temp, size_t y, size_t x){ 
    uchar* ptr = (uchar*)temp.getTemp().data; 
    size_t min_y = temp.getTemp().rows, min_x = temp.getTemp().cols, max_y = 0, max_x = 0; 

    for (int i = 0; i < 4; i++){ 
     int kernel[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; 
     int temp_y = y + kernel[i][0]; 
     int temp_x = x + kernel[i][1]; 
     uchar val = ptr[temp.getTemp().step * temp_y + temp_x]; //breaks here 

     if (val == 255) { 
      temp.setValZero(x, y); 
      x = temp_x; 
      y = temp_y; 

      if (temp_x > max_x) 
       max_x = temp_x; 
      if(temp_x < min_x) 
       min_x = temp_x; 
      if (temp_y > max_y) 
       max_y = temp_y; 
      if (temp_y < min_y) 
       min_y = temp_y; 

      int pass_x = ((max_x - min_x)/2); 
      int pass_y((max_y - min_y)/2); 

      setCoordinates(pass_x, pass_y); 
      connectivity(temp, y, x); 
     } 
    } 
} 

這裏是代碼的其餘部分。以上connectivity()方法在BLOB類中。

#include "opencv2/opencv.hpp" 
#include<stdio.h> 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/highgui/highgui.hpp" 

using namespace cv; 
using namespace std; 

class BlobBurnMat{ 
//Class used to store a copy of the source image where pixels get burned in BLOB finding. 

    private: 
     Mat temp; 
    public: 
     void initiate(Mat temp){ 
     this -> temp = temp; 
     } 
    Mat getTemp(){ 
     return temp; 
    } 
    void setValZero(int x, int y){ 
     temp.at<uchar>(y, x) = 0; 
    } 
}; 

class BLOB{ 
//BLOB class to store coordinates of the BLOBs before they are added to the vector-array-list-thingamajig 

    private: 
     int x, y; 
    public: 

    void setCoordinates(int x, int y){ 
     this->x = x; 
     this->y = y; 
    } 
    int getX(){ 
     return x; 
    } 
    int getY(){ 
     return y; 
    } 

    void connectivity(BlobBurnMat temp){ 
     connectivity(temp, x, y); 
    } 

    void connectivity(BlobBurnMat temp, int y, int x){ 
     uchar* ptr = (uchar*)temp.getTemp().data; 
     int min_y = temp.getTemp().rows, min_x = temp.getTemp().cols, max_y = 0, max_x = 0; 

     for (int i = 0; i < 4; i++){ 
      int kernel[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; 
      int temp_y = y + kernel[i][0]; 
      int temp_x = x + kernel[i][1]; 
      uchar val = ptr[temp.getTemp().step * temp_y + temp_x]; 

      if (val == 255) { 
       temp.setValZero(x, y); 
       x = temp_x; 
       y = temp_y; 

       if (temp_x > max_x) 
        max_x = temp_x; 
       if(temp_x < min_x) 
        min_x = temp_x; 
       if (temp_y > max_y) 
        max_y = temp_y; 
       if (temp_y < min_y) 
        min_y = temp_y; 

       int pass_x = ((max_x - min_x)/2); 
       int pass_y((max_y - min_y)/2); 

      setCoordinates(pass_x, pass_y); 
      connectivity(temp, y, x); 
      } 
     } 
    } 
}; 

vector<Point2i> getBlobCoordinates(Mat src){ 
    BlobBurnMat *temp = new BlobBurnMat(); 
    temp->initiate(src.clone()); 

    vector<Point2i> blobCoordinates; //Vector holding all BLOB coordinates 
    Point2i blobCoords; //Coordinates of a single BLOB 

    //Go through the binary matrix looking for white pixels. 
    for (size_t y = 0; y < src.rows; y++) { 
     for (size_t x = 0; x < src.cols; x++) { 

      uchar* ptr = (uchar*)temp->getTemp().data; 
      uchar val = ptr[temp->getTemp().step * y + x]; 

      if (val == 255){ 

       BLOB *blob = new BLOB(); 
       blob->setCoordinates(x, y); 

       blob->connectivity(*temp); 

       blobCoords.x = blob->getX(); 
       blobCoords.y = blob->getY(); 

       blobCoordinates.push_back(blobCoords); //add a new element to the vector. 

      } 
     } 
    } 
    return blobCoordinates; 
} 


int main(int, char){ 
    Mat src; 
    String path = "C:/Users/Runagar/Desktop/segment.jpg"; 
    src = imread(path, 0); 
    if (src.data && !src.empty()){ 
     imshow("blobie", src); 
    } 
    else cout << "You fucked up "; 

    vector <Point2i> blobCoordinates = getBlobCoordinates(src); 
    for (int k = 0; k < blobCoordinates.size(); k++) 
     cout << blobCoordinates[k]; 

    waitKey(0); 
    return 0; 
} 

在此先感謝!

回答

0

Mat getTemp()返回您的Mat實例的副本

uchar* ptr = (uchar*)temp.getTemp().data;檢索從臨時墊實例的指針。這個實例會立即被刪除,並且你留下一個指向(大概)正確刪除數據的指針。

嘗試Mat & getTemp()代替。

+0

等,'墊&getTemp(){返回溫度;}'?因爲那可悲沒有幫助。 –

1

在i == 2並且x == 0,TEMP_X == -1,所以你讀allocaded存儲器以外的ptr前1個字節。

你必須處理的情況下,當x == 0,Y == 0,X == src.cols和y == src.rows。

相關問題