图像 模板匹配 - 方差匹配 实现

误差平方和算法(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值