基于opencv的多⽬标模板匹配
利⽤opencv进⾏多⽬标模板匹配,只要是利⽤其matchTemplate函数,但在多⽬标(这⾥是讨论⽬标图⽚中不同⼤⼩模板的匹配),以下贴出代码和图⽚,供⼤家参考:
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
Point getNextMinLoc(Mat &result, Point minLoc, int maxValue, int templatW, int templatH);
int main(void)
{
Mat src = imread("1_2.png");
Mat srcCopy = src.clone();
Mat temp = imread("1_4.png");
Mat result;
if (pty() || pty())
{
cout << "打开图⽚失败" << endl;
return 0;
}
vector<Mat> templat;
vector<float> minV;
vector<Point> minL;
int srcW, srcH, templatW, templatH, resultH, resultW;
srcW = ls;
srcH = ws;
templat.push_back(temp);
double minValue, maxValue;
Point minLoc, maxLoc;
for (int i=0;i<10;i++)
{
cout << i << ": ";
templatW = templat[i].cols;
templatH = templat[i].rows;
if (srcW < templatW || srcH < templatH)
{
cout << "模板不能⽐原图⼤" << endl;
return 0;
}
resultW = srcW - templatW + 1;
resultH = srcH - templatH + 1;
matchTemplate(src, templat[i], result, CV_TM_SQDIFF_NORMED);
minMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);
cout << "min1: " << minValue << endl;
if (minValue<=0.070055)
if (minValue<=0.070055)
{
rectangle(srcCopy, minLoc, Point(minLoc.x + templatW, minLoc.y + templatH), Scalar(0, 0, 255), 2, 8, 0);
Point new_minLoc;
new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);
float *data = result.ptr<float>(new_minLoc.y);
cout << "min2: " << data[new_minLoc.x] << " ";
if (data[new_minLoc.x]<=0.5)
{
cout << "进这个函数了:" << i << ":" << new_minLoc.x;
cout << " " << new_minLoc.y;
rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),
Scalar(0, 255, 0), 2, 8, 0);
new_minLoc = getNextMinLoc(result, new_minLoc, maxValue, templatW, templatH);
}
float *data1 = result.ptr<float>(new_minLoc.y);
cout << "min3: " << data1[new_minLoc.x] << " " << endl;
if (data1[new_minLoc.x] <= 0.4)
{rectangle函数opencv
rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),
Scalar(255, 0, 0), 2, 8, 0);
}
}
cout << "#" << endl;
Mat temp_templat;
resize(templat[i], temp_templat, Size(templat[i].cols / 1.1, templat[i].rows / 1.1));
templat.push_back(temp_templat);
}
imshow("结果", srcCopy);
waitKey(0);
return 0;
}
Point getNextMinLoc(Mat &result, Point minLoc, int maxValue, int templatW, int templatH)
{
//imshow("result", result);
//cout << "maxvalue: " << maxValue << endl;
int startX = minLoc.x - templatW / 3;
int startY = minLoc.y - templatH / 3;
int endX = minLoc.x + templatW / 3;
int endY = minLoc.y + templatH / 3;
if (startX < 0 || startY < 0)
{
startX = 0;
startY = 0;
}
if (endX > ls - 1 || endY > ws - 1)
{
endX = ls - 1;
endY = ws - 1;
}
int y, x;
for (y = startY; y < endY; y++)
{
for (x = startX; x < endX; x++)
{
float *data = result.ptr<float>(y);
data[x] = maxValue;
}
}
double new_minValue, new_maxValue;
Point new_minLoc, new_maxLoc;
minMaxLoc(result, &new_minValue, &new_maxValue, &new_minLoc, &new_maxLoc); //imshow("result_end", result);
return new_minLoc;
}
以下是结果图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论