[C#]OpenCVで相違度[SSD(Sum of Squared Difference)]を計算する


相違度[SSD(Sum of Squared Difference)]は比較画像をラスタスキャンし、同じ位置の画素の輝度値の差の2乗の合計が用いられます。
SSDの値が小さいほど、似ている位置となります。
OpenCVSharpを使用したコードは以下となります。

static int Get_Ssd(IplImage imgA,IplImage imgB)
{
IplImage tmpA = Cv.CreateImage(Cv.GetSize(imgA), BitDepth.F64, imgA.NChannels);
Cv.Scale(imgA,tmpA);
IplImage tmpB;
if (imgA.Width != imgB.Width || imgA.Height != imgB.Height)
{
IplImage _tmpB = new IplImage(Cv.GetSize(imgA), imgA.Depth, imgA.NChannels);
Cv.Resize(imgB, _tmpB, Interpolation.NearestNeighbor);
tmpB = Cv.CreateImage(Cv.GetSize(_tmpB), BitDepth.F64, imgB.NChannels);
Cv.Scale(_tmpB, tmpB);
Cv.ReleaseImage(_tmpB);
}
else
{
tmpB = Cv.CreateImage(Cv.GetSize(imgA), BitDepth.F64, imgB.NChannels);
Cv.Scale(imgB, tmpB);
}
IplImage tmp = Cv.CloneImage(tmpA);
Cv.Sub(tmpA, tmpB, tmp);
Cv.Pow(tmp, tmp, 2);
CvScalar SumData = Cv.ScalarAll(0);
SumData = Cv.Sum(tmp);
Cv.ReleaseImage(tmpA);
Cv.ReleaseImage(tmpB);
Cv.ReleaseImage(tmp);
return Cv.Round(SumData.Val0 + SumData.Val1 + SumData.Val2 + SumData.Val3);
}



0 件のコメント :

コメントを投稿