我想創建我的個人斑點檢測算法 據我所知,我首先必須創建不同的高斯內核與不同的西格瑪(我正在使用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一無所知。我只是在學習
請注意,當pProcess未被觸發時,此代碼不會爲圖像的右邊緣和右邊緣上的點提供結果:this代碼不健壯! – TimZaman 2014-06-15 11:13:39