私は個人的なブロブ検出アルゴリズムを作成しようとしています。私が知る限り、最初に異なるシグマを持つ異なるガウス カーネルを作成する必要があります (これは を使用していますMat kernel= getGaussianKernel(x,y);
)。次に、そのカーネルのラプラシアンを取得し、それを使用して画像をフィルター処理するので、私を作成します。スケールスペース。ここで、スケールスペースの各結果イメージでローカル マキシマを見つける必要があります。しかし、そうする適切な方法を見つけることができないようです....これまでの私のコードは
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;
}
ここのこのスレッドで見つけたもので、最大値がある点のベクトルを返すと思われます。ポイントのベクトルを返しますが、各ポイントのすべての x 座標と y 座標は常に -17891602 です...どうすればいいですか? 私はopencvについて何も知らないので、私のコードを修正する以外の何かで私を導く場合は、参考にしてください。私はただ学んでいます