#include "CMainWindow.h"
#include <QString>
#include <QDebug>
#include<opencv2/opencv.hpp>
CMainWindow::CMainWindow(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
connect(ui.pushButton, &QPushButton::clicked, this, &CMainWindow::onBtnClick);
}
void CMainWindow::onBtnClick()
{
//从本地读取图片
cv::Mat srcImage = cv::imread("\\\\10.30.21.198\\UserDesktop01\\112760\\Desktop\\1.png", 1);
cv::Mat templateImage = cv::imread("\\\\10.30.21.198\\UserDesktop01\\112760\\Desktop\\2.png", 1);
//创建窗口显示图片
//cv::imshow("srcImage", srcImage);
//cv::imshow("templateImage", templateImage);
//保存结果的矩阵 必须是单通道32位浮点。如果image的尺寸为W x H,templ的尺寸为w x h,则result的尺寸为(W-w+1)x(H-h+1)
cv::Mat result;
int result_cols = srcImage.cols - templateImage.cols + 1;
int result_rows = srcImage.rows - templateImage.rows + 1;
result.create(result_cols, result_rows, CV_32FC1);
//method :模板匹配的算法
enum { TM_SQDIFF = 0, TM_SQDIFF_NORMED = 1, TM_CCORR = 2, TM_CCORR_NORMED = 3, TM_CCOEFF = 4, TM_CCOEFF_NORMED = 5 };
//TM_CCOEFF是相关性系数匹配;TM_CCOEFF_NORMED是标准相关性系数匹配。将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列)。
cv::matchTemplate(srcImage, templateImage, result, TM_CCOEFF_NORMED);
double minVal = -1; //最小匹配系数
double maxVal; //最大匹配系数
cv::Point minLoc; //最小匹配系数的坐标
cv::Point maxLoc; //最大匹配系数的坐标
cv::Point matchLoc; //最佳匹配系数的坐标
//result表示在每个点的匹配系数 通过该函数找到最佳的匹配系数和开始坐标
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat());
//取大值(视匹配方法而定)
// matchLoc = minLoc;
matchLoc = maxLoc;
//取大值,值越小表示越匹配
QString str = "Similarity:" + QString::number((maxVal) * 100, 'f', 2) + "%";
qDebug() << str;
cv::Mat mask = srcImage.clone();
//绘制最匹配的区域 在图中把匹配区域框出
rectangle(mask, matchLoc, cv::Point(matchLoc.x + templateImage.cols, matchLoc.y + templateImage.rows), cv::Scalar(0, 255, 0), 2, 8, 0);
cv::imshow("mask", mask);
}
下载安装opencv-3.4.6
vs2017新建QT x64 GUI程序
项目配置如下
附加包含目录:
D:\soft\OpenCV\opencv\build\include\opencv2
D:\soft\OpenCV\opencv\build\include
附加库目录
D:\soft\OpenCV\opencv\build\x64\vc14\lib
附加依赖项
opencv_world346d.lib