一、实现模板匹配matchTemplate()
原型
void matchTemplate(
InputArray image,
InputArray templ,
OutputArray result,
int method
)
参数
- image:待搜素的图像。必须为8位或32位浮点型图像
- templ:用于搜素的模板图像。需和待搜素的图像数据类型一样,且尺寸不能大于它。
- result:比较结果的映射图像。必须为单通道、32位浮点型图像
- method:匹配方法
- TM_SQDIFF:平方差匹配法
- TM_SQDIFF_NORMED:归一化
- TM_CCORR:相关匹配法
- TM_CCORR_NORMED:归一化相关匹配法
- TM_CCOEFF:系数匹配法
- TM_CCOEFF_NORMED:归一化系数匹配法
例子
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
//灰度图
Mat srcImage=imread("M.jpg",0);
//取阈值成二值图
srcImage=srcImage>180;
//CLOSE
Mat kernel=getStructuringElement(MORPH_RECT,Size(25,25));
morphologyEx(srcImage,srcImage,MORPH_CLOSE,kernel);
namedWindow("srcImage",WINDOW_NORMAL);
imshow("srcImage",srcImage);
Mat dstImage=Mat::zeros(srcImage.size(),srcImage.type());
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(srcImage,contours,hierarchy,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
Scalar color(rand()&255,rand()&255,rand()&255);
drawContours(dstImage,contours,-1,color,FILLED,8,hierarchy);
vector<vector<Point> >::iterator It;
Point vertex[4];
int x1,y1,x2,y2;
int keyworld=0;
for(It = contours.begin();It < contours.end();It++)
{
//画出可包围数字的最小矩形
Rect rect = boundingRect(*It);
vertex[0] = rect.tl();
//矩阵左上角的点
vertex[1].x = rect.tl().x, vertex[1].y =rect.br().y;
//矩阵左下方的点
vertex[2] = rect.br();
//矩阵右下角的点
vertex[3].x = rect.br().x, vertex[3].y =rect.tl().y;
//矩阵右上方的点
for( int j = 0; j < 4; j++)
{
line(dstImage,vertex[j],vertex[(j+1)%4],Scalar(255,255,255),20);
}
if(keyworld==0)
{
x1=vertex[0].x;
y1=vertex[0].y;
x2=vertex[2].x;
y2=vertex[2].y;
keyworld=1;
}
}
// namedWindow("dstImage",WINDOW_NORMAL);
// imshow("dstImage",dstImage);
srcImage=srcImage(Rect(x1,y1,x2-x1,y2-y1));
namedWindow("srcImagePlus",WINDOW_NORMAL);
imshow("srcImagePlus",srcImage);
Mat templateImage=imread("NG/n0.jpg",0);
int resultImageCols=srcImage.cols-templateImage.cols+1;
int resultImageRows=srcImage.rows-templateImage.rows+1;
Mat resultImage;
resultImage.create(resultImageCols,resultImageRows,CV_32FC1);
matchTemplate(srcImage,templateImage,resultImage,TM_SQDIFF);
imshow("result",resultImage);
waitKey();
return 0;
}
二、minMaxLoc
原型
void minMaxLoc(
InputArray src,
double* minVal,
double* maxVal=0,
Point* minLoc=0,
Point* maxLoc=0,
InputArray mask=noArray()
)
查找数组中的全局最小值和最大值。
函数cv :: minMaxLoc查找最小和最大元素值及其位置。在整个数组中搜索极值,或者如果掩码不是空数组,则在指定的数组区域中搜索极值。
该功能不适用于多通道阵列。如果需要在所有通道中找到最小或最大元素,请首先使用Mat :: reshape将数组重新解释为单通道。或者您可以使用extractImageCOI或mixChannels或split来提取特定通道。
参数
- src:输入图像为单通道阵列。
- minVal:指向返回的最小值的指针; 如果不需要,则使用NULL。
- maxVal:指向返回的最大值的指针; 如果不需要,则使用NULL。
- minLoc:指向返回的最小位置的指针(在2D情况下); 如果不需要,则使用NULL。
- maxLoc:指向返回的最大位置的指针(在2D情况下); 如果不需要,则使用NULL。
- mask:用于选择子数组的可选掩码。
例
double minVal,maxVal;
Point minLoc,maxLoc;
minMaxLoc(srcIamge,&minVal,&maxVal,&minLoc,&maxLoc,Mat());