C# emgu 多模板匹配

public MatchInfo GetMatchPos(string Src, string Template)
{
MatchInfo myMatchInfo = new MatchInfo();
Image<Bgr, byte> a = new Image<Bgr, byte>(Src);
Image<Bgr, byte> b = new Image<Bgr, byte>(Template);
Image<Bgr, byte> aa = new Image<Bgr, byte>(Src);
Image<Gray, float> c = new Image<Gray, float>(a.Width, a.Height);
c = a.MatchTemplate(b, TemplateMatchingType.CcorrNormed);
double min = 0, max = 0;
Point maxp = new Point(0, 0);
Point minp = new Point(0, 0);
CvInvoke.MinMaxLoc(c, ref min, ref max, ref minp, ref maxp);
//for (int i =0;i< c.; i++) {

//}
Console.WriteLine(max + "-" + maxp.X + "," + maxp.Y);
Console.WriteLine(min + "-"+minp.X + "," + minp.Y);
CvInvoke.Rectangle(aa, new Rectangle(maxp, new Size(b.Width, b.Height)), new MCvScalar(0, 0, 255), 3);
CvInvoke.Rectangle(aa, new Rectangle(minp, new Size(b.Width+13, b.Height+13)), new MCvScalar(0, 255, 255), 3);
Image<Gray, float> c1 = c;
int getcnt = 0;
Lab1:
c1 = getNextMinLoc(c1, maxp, (int)max, b.Width, b.Height);
CvInvoke.MinMaxLoc(c1, ref min, ref max, ref minp, ref maxp);
if (max < 0.95)
{
goto Lab2;
}
getcnt++;
if (getcnt > 10) {
goto Lab2;
}
Console.WriteLine(max + "-" + maxp.X + "," + maxp.Y);
CvInvoke.Rectangle(aa, new Rectangle(maxp, new Size(b.Width, b.Height)), new MCvScalar(0, 255, 0), 3);
goto Lab1;
Lab2:
myMatchInfo.matchMax = max;
myMatchInfo.matchMin = min;
myMatchInfo.matchPicture = aa;
myMatchInfo.matchRectangle = new Rectangle(maxp, new Size(b.Width, b.Height));
myMatchInfo.matchMaxLoc = maxp;
myMatchInfo.matchMinLoc = minp;
return myMatchInfo;
}
Image<Gray, float> getNextMinLoc(Image<Gray, float> result, Point maxLoc, int maxVaule, int templatW, int templatH)
{

// 先将第一个最大值点附近模板宽度和高度的都设置为最大值防止产生干扰
int startX = maxLoc.X- (templatW>>2);//
int startY = maxLoc.Y- (templatH >> 2);//
int endX = maxLoc.X+ (templatW >> 2);//
int endY = maxLoc.Y+ (templatH >> 2);//
if (startX < 0 || startY < 0)
{
startX = 0;
startY = 0;
}
if (endX > result.Width - 1 || endY > result.Height - 1)
{
endX = result.Width - 1;
endY = result.Height - 1;
}
int y, x;
for (y = startY; y < endY; y++)
{
for (x = startX; x < endX; x++)
{
CvInvoke.cvSetReal2D(result, y, x, maxVaule);
}
}

return result;

}

转载于:https://www.cnblogs.com/guyandianzi/p/10485127.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值