原创EMGUCV的模板匹配与跟踪完成啦.docx
《原创EMGUCV的模板匹配与跟踪完成啦.docx》由会员分享,可在线阅读,更多相关《原创EMGUCV的模板匹配与跟踪完成啦.docx(10页珍藏版)》请在冰豆网上搜索。
原创EMGUCV的模板匹配与跟踪完成啦
原创-EMGUCV的模板匹配与跟踪完成啦!
兄弟们好!
经过很多天的努力学习,我的EMGUCV的模板匹配完成了,用实际的摄像头取图象,再存为模板后,就能实现物体跟踪,还能进行相机上马达进行位置确定。
好玩吧!
弄两幅图来看下。
这是匹配的,还能过行坐标二次定位。
坐标二次定位的
这是跟踪的
以下为代码,只有自己写的部分,由软件生成的部分没有帖上
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Threading;
usingSystem.IO;
usingSystem.Drawing.Imaging;
usingEmgu.CV;
usingEmgu.CV.Structure;
usingEmgu.CV.CvEnum;
usingEmgu.CV.Util;
usingEmgu.CV.UI;
usingEmgu.CV.VideoSurveillance;
usingEmgu.Util;
usingEmgu.Util.TypeEnum;
usingEmgu.CV.GPU;
namespace模板匹配
{
publicpartialclassForm1:
Form
{
publicImagesrc;
publicImagetempsrc;
publicForm1()
{
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
OpenFileDialogof=newOpenFileDialog();
of.Filter="(jpg)|*.jpg";
if(of.ShowDialog()==DialogResult.OK)
{
Imageimsrc=newImage(of.FileName);
imageBox2.Image=imsrc;
src=imsrc;
imageBox1.Image=null;
}
}
privatevoidbutton2_Click(objectsender,EventArgse)
{
if(src!
=null)
{
Imageimgsrc=src.Clone();//不可直接将src符值给新建图象,它传的只是一个地址,不是数据,要先考贝后才能不再引响原图像
Imageimggray=imgsrc.Convert();
Imageimgthread=imggray.ThresholdBinary(newGray(60),newGray(255));
Imageimgcanny=imgthread.Canny(130,255);
//Contourcontour=imgcanny.FindContours();//这个函数用来找中间的轮廓的每一个点,是一个数组点,很多个才能组成一个圆。
CircleF[]cf=imgthread.HoughCircles(newGray(130),newGray(255),10,1,1,400)[0];
MCvFontmf=newMCvFont(FONT.CV_FONT_HERSHEY_COMPLEX,1,1);
if(cf.Length>0)
{
cf[0].Radius=cf[0].Radius+50;
imgsrc.Draw(cf[0],newBgr(0,0,255),2);
Rectanglerec=newRectangle((int)(cf[0].Center.X-cf[0].Radius),(int)(cf[0].Center.Y-cf[0].Radius),(int)(cf[0].Radius*2),(int)(cf[0].Radius*2));
imgsrc.Draw(rec,newBgr(0,0,255),2);
imgsrc.Draw(cf[0].Center.ToString()+","+cf[0].Radius.ToString(),refmf,newPoint(0,src.Height-30),newBgr(0,0,255));
Imagetemplatebgr=src.Clone();
Imagetemp1=templatebgr.GetSubRect(rec).Clone();
imageBox1.Image=temp1;
temp1.Save(@"e:
\template.jpg");
tempsrc=temp1.Clone();
MessageBox.Show(@"模板生成成功!
已保存到e:
\template.jpg中");
}
else
{
imgsrc.Draw(@"Dn'tfindoutcircle!
PLStryagina.",refmf,newPoint(0,src.Height-30),newBgr(0,0,255));
imageBox1.Image=imgcanny;
}
}
}
privatevoidbutton3_Click(objectsender,EventArgse)
{
Imageimgsrc=src.Convert().Clone();
Imagereadimg=newImage(@"e:
\template.jpg");
Imagetemplate=readimg.Convert().Clone();
Imageimgcolor=src.Clone();
Image imgresult=imgsrc.MatchTemplate(template,TM_TYPE.CV_TM_CCOEFF).Convert().Clone();
imageBox1.Image=imgresult;
doublebestvalue;
Pointbestpoint;
FindBestPoint(imgresult,TM_TYPE.CV_TM_CCOEFF,outbestvalue,outbestpoint);
Rectanglerec1=newRectangle(newPoint(bestpoint.X,bestpoint.Y),template.Size);
imgcolor.Draw(rec1,newBgr(0,0,255),2);
MCvFontmf=newMCvFont(FONT.CV_FONT_HERSHEY_COMPLEX,1,1);
imgcolor.Draw(rec1.X.ToString()+","+rec1.Y.ToString(),refmf,newPoint(0,src.Height-30),newBgr(0,0,255));
imageBox1.Image=imgcolor ;
}
publicvoidFindBestPoint(Imageimage,TM_TYPEtmtype,outdoublebestvalue,outPointbestpoint)
{
bestvalue=0d;
bestpoint=newPoint(0,0);
double[]max,min;
Point[]maxl,minl;
image.MinMax(outmin,outmax,outminl,outmaxl);
if(tmtype==TM_TYPE.CV_TM_SQDIFF||tmtype==TM_TYPE.CV_TM_SQDIFF_NORMED)
{
bestvalue=min[0];
bestpoint=minl[0];
}
else