误差平方和算法(SSD)
误差平方和算法(Sum of Squared Differences,简称SSD算法),也叫差方和算法。实际上,SSD算法与SAD算法如出一辙,只是其相似度测量公式有一点改动(计算的是子图与模板图的L2距离)。这里不再赘述。
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <math.h>
#include <opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, const char* argv[]) {
//模板原图
cv::Mat ScrImg = cv::imread("B.jpg", cv::IMREAD_GRAYSCALE);
int Srows = ScrImg.rows;
int Scols = ScrImg.cols;
int Sdepth = ScrImg.channels();
//匹配图
cv::Mat TargitImg = cv::imread("B_.jpg", cv::IMREAD_GRAYSCALE);
int Trows = TargitImg.rows;
int Tcols = TargitImg.cols;
int Tchanel = TargitImg.channels();
int endR = Srows - Trows;
int endC = Scols - Tcols;
int ChanelNum = Sdepth;
int Squarediff = 255* Trows* Trows*Tcols* Tcols*3;
int outr=0, outc=0;
for (int starR = 0; starR < endR; starR++)
{
for (int starC = 0; starC < endC; starC++)
{
//cv::Mat pMat = ScrImg(Rect(starR, starC, Trows, Tcols));
int temp = 0;
for (int diffr =0; diffr < Trows; diffr++)
{
for (int diffc =0 ; diffc < Tcols; diffc++)
{
if (Tchanel == 1) {
temp += (ScrImg.at<uchar>(starR + diffr, starC + diffc)- TargitImg.at<uchar>(diffr, diffc))*
(ScrImg.at<uchar>(starR + diffr, starC + diffc) - TargitImg.at<uchar>(diffr, diffc));
}
else
{
for (int chanels = 0; chanels < Tchanel; chanels++) {
temp += (ScrImg.at<Vec3b>(starR + diffr, starC + diffc)[chanels] - TargitImg.at<Vec3b>(diffr, diffc)[chanels])*
(ScrImg.at<Vec3b>(starR + diffr, starC + diffc)[chanels] - TargitImg.at<Vec3b>(diffr, diffc)[chanels]);
}
}
}
}
if (temp < Squarediff)
{
Squarediff = temp;
outr = starR;
outc = starC;
}
}
}
Rect rect(outc, outr, Tcols, Trows);//左上坐标(x,y)和矩形的长(x)宽(y)
cv::rectangle(ScrImg, rect, Scalar(255, 0, 0), 1, LINE_8, 0);
cv::imshow("原图", ScrImg);
cv::imshow("匹配图", TargitImg);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}