2013-02-28 257 views
0

我想創建我的個人斑點檢測算法 據我所知,我首先必須創建不同的高斯內核與不同的西格瑪(我正在使用Mat kernel= getGaussianKernel(x,y);)然後得到該內核的拉普拉斯算子然後過濾圖像,所以我創建了我的尺度空間。現在我需要在尺度空間的每個結果圖像中找到局部極大值。但我似乎無法找到一個妥善的辦法做下去....到目前爲止我的代碼是查找局部最大值灰度圖像opencv

vector <Point> GetLocalMaxima(const cv::Mat Src,int MatchingSize, int Threshold) 
{ 
    vector <Point> vMaxLoc(0); 

    if ((MatchingSize % 2 == 0)) // MatchingSize has to be "odd" and > 0 
    { 
     return vMaxLoc; 
    } 

    vMaxLoc.reserve(100); // Reserve place for fast access 
    Mat ProcessImg = Src.clone(); 
    int W = Src.cols; 
    int H = Src.rows; 
    int SearchWidth = W - MatchingSize; 
    int SearchHeight = H - MatchingSize; 
    int MatchingSquareCenter = MatchingSize/2; 


    uchar* pProcess = (uchar *) ProcessImg.data; // The pointer to image Data 

    int Shift = MatchingSquareCenter * (W + 1); 
    int k = 0; 

    for(int y=0; y < SearchHeight; ++y) 
    { 
     int m = k + Shift; 
     for(int x=0;x < SearchWidth ; ++x) 
     { 
      if (pProcess[m++] >= Threshold) 
      { 
       Point LocMax; 
       Mat mROI(ProcessImg, Rect(x,y,MatchingSize,MatchingSize)); 
       minMaxLoc(mROI,NULL,NULL,NULL,&LocMax); 
       if (LocMax.x == MatchingSquareCenter && LocMax.y == MatchingSquareCenter) 
       { 
        vMaxLoc.push_back(Point(x+LocMax.x,y + LocMax.y)); 
        // imshow("W1",mROI);cvWaitKey(0); //For gebug    
       } 
      } 
     } 
     k += W; 
    } 
    return vMaxLoc; 
} 

我在this線程在這裏,它理應返回,其中極大值的點的載體中。它確實返回了一個點的矢量,但是每個點的所有x和y座標總是-17891602 ...怎麼辦? 如果您要引導我進行其他操作,而不是糾正我的代碼,請提供信息,因爲我對opencv一無所知。我只是在學習

+0

請注意,當pProcess未被觸發時,此代碼不會爲圖像的右邊緣和右邊緣上的點提供結果:this代碼不健壯! – TimZaman 2014-06-15 11:13:39

回答

0

我發現它們。問題是我的門檻太高。我不明白爲什麼它給了我負值而不是零點,但降低了閾值

0

這裏的問題是你的LocMax點在內部循環內部聲明並且從不初始化,所以它每次都返回垃圾數據。如果您回頭看StackOverflow question you linked,您會看到他們的類似變量Point maxLoc(0,0)在頂部被聲明,並被構造爲指向搜索窗口的中間位置。它只需要初始化一次。後續循環迭代將用minMaxLoc函數結果替換該值。

總之,刪除此行中的內循環:

Point LocMax; // delete this 

並添加接近頂部略微改動的版本:

vector <Point> vMaxLoc(0); // This was your original first line 
Point LocMax(0,0); // your new second line 

這應該讓你開始呢。

+0

仍然得到相同的x和y,我發送錯誤的匹配距離? – 2013-02-28 21:22:16

+0

我真的認爲會這樣做。我認爲你應該設置一個斷點並追蹤你的記憶。如果你的向量返回的長度爲0,那麼這是一回事,但如果它有一個具有唯一內存地址的點列表,那麼這些點就被定義(或至少被分配)在某個地方,然後消失。 – 2013-02-28 22:00:20

+0

就是這樣,它沒有獨特的價值,它們都是一樣的 – 2013-02-28 22:13:43