opencv进行5种模板匹配,opencv模板匹配,运行后通过在屏幕上输入对应指令完成相对应的匹配方法。

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class mat
{
public:
    void match(Mat& src, Mat& dst, int method);
};

int maxmethod = 5;
void mat::match(Mat& src, Mat& dst, int method)
{
    //flip(dst, dst, 2);//将模板图左右翻转

    //提前为result分配内存
    int result_rows = src.rows - dst.rows + 1;
    int result_cols = src.cols - dst.cols + 1;
    Mat result;
    result.create(Size(result_cols, result_rows), CV_32FC3);
    matchTemplate(src, dst, result, method);//result是一个数组
    //dst1(i,j) = dst(i,j) *alpha / norm (src,norm_type,mask)
    normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
    double minval, maxval;
    Point minloc, maxloc, loc;

    minMaxLoc(result, &minval, &maxval, &minloc, &maxloc, Mat());
    //cout << "min=" << minval << " maxval=" << maxval << endl;
    if (method == 1 || method == 0)
    {
        loc = minloc;
    }
    else
    {
        loc = maxloc;
    }
    Rect rect;
    rect.x = loc.x;
    rect.y = loc.y;
    rect.width = dst.cols;
    rect.height = dst.rows;
    rectangle(src, rect, Scalar(0, 0, 255), 2, 8, 0);
    imshow("模板图", dst);
    imshow("原图", src);
    imshow("匹配结果图", result);
}

//    match_method参数设置,模板匹配方法:
//    0,平方差匹配,找最小值,值越接近0,匹配效果越好
//    1,归一化平方差匹配,找最小值,值越接近0,匹配效果越好
//    2,相关性匹配方法,该方法使用源图像与模板图像的卷积结果进行匹配,因此,最佳
//     匹配位置在值最大处,值越小匹配结果越差
//    3,归一化的相关性匹配方法,与相关性匹配方法类似,最佳匹配位置也是在值最大处
//    4,相关性系数匹配方法,该方法使用源图像与其均值的差、模板与其均值的差二者之
//     间的相关性进行匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处,值
//     等于0直接表示二者不相关。
//    5,归一化的相关性系数匹配方法,正值表示匹配的结果较好,负值则表示匹配的效果较
       //差,也是值越大,匹配效果也好。

int main()
{
    Mat src = imread("D:\\VC\\c++\\opencv源码\\opencv源码\\12.bmp");//读入图像
    Mat dst = imread("D:\\VC\\c++\\opencv源码\\opencv源码\\122.bmp");
    cout << "******0:平方差匹配*****************" << endl;
    cout << "******1:归一化平方差匹配***********" << endl;
    cout << "******2:相关性匹配方法*************" << endl;
    cout << "******3:归一化的相关性匹配方法*****" << endl;
    cout << "******4:相关性系数匹配方法*********" << endl;
    cout << "******5:归一化的相关性系数匹配方法*" << endl;
    cout << "******6:退出系统*******************" << endl;
    while (true)
    {
        int method;
        cout << "*****请输入模板匹配方法************" << endl;
        cin >> method;
        if (method == 6)
        {
            return 0;
            break;
        }
        else
        {
            mat p;
            p.match(src, dst, method);
            waitKey(100);
        }
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鹿( ﹡ˆoˆ﹡ )

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值