模板图像:目标图像:
C++:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void TempMatch(Mat img1,Mat img2)
{
int width = img1.cols - img2.cols + 1;
int height = img1.rows - img2.rows + 1;
Mat result_image(height, width, CV_32FC1);
//方法有好几种,这里只选取了TM_CCORR这一种
matchTemplate(img1, img2, result_image, TM_CCORR, Mat());
normalize(result_image, result_image, 0, 1, NORM_MINMAX, -1, Mat());
Point minloc, maxloc;
double min, max;
//最小值,最大值,最小值的位置,最大值的位置
//所以只能寻找单个模板识别,并且是相关性最大的那个位置
minMaxLoc(result_image, &min, &max, &minloc, &maxloc, Mat());
Mat src;
img1.copyTo(src);
/*double threshold = 0.75;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
if (result_image.at<float>(i,j) >= threshold)
rectangle(src,Rect(j, i, img2.cols, img2.rows), Scalar(0, 250, 0), 2, 8);
}
}*/
rectangle(src, Rect(maxloc.x, maxloc.y, img2.cols, img2.rows), Scalar(0, 250, 0), 4, 8);
imshow("1",src);
imshow("2",img2);
};
int main()
{
//测试图像,模板图像
Mat image,temp_image;
image = imread("D:/testimage/oranges.jpg");
temp_image = imread("D:/testimage/sample.jpg");
TempMatch(image,temp_image);
waitKey(0);
return 0;
};
结果:
Python:
import cv2 as cv
import numpy as np
def TempMatch(image1,image2):
w1,h1=image1.shape[:2]
w2, h2 = image2.shape[:2]
width=w1-w2+1
height=h1-h2+1
result_image=np.zeros((height,width),np.float32)
#方法有好几种,这里只选取了TM_CCORR这一种
result_image=cv.matchTemplate(image1,image2,cv.TM_CCORR)
cv.normalize(result_image,result_image,0,1,cv.NORM_MINMAX,-1)
#最小值,最大值,最小值的位置,最大值的位置
#所以只能寻找单个模板识别,并且是相关性最大的那个位置
minVal,maxVal,minLoc,maxLoc=cv.minMaxLoc(result_image)
src=image1
cv.rectangle(src,maxLoc,(maxLoc[0]+w2,maxLoc[1]+h2)
,(255,0,0),4)
cv.imshow("result",src)
cv.imwrite("D:/testimage/result-tempmatch.jpg", src)
if __name__=="__main__":
img=cv.imread("D:/testimage/oranges.jpg")
img1=cv.imread("D:/testimage/sample.jpg")
#gray_dst = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
TempMatch(img,img1)
cv.waitKey(0)
cv.destroyAllWindows()