使用emgucv c#...
我想找到另一个图像内部的对象的图像。
要测试代码,我会在原始图像中裁剪要查找的图像,并将其另存为Template.jpg。
然后,我使用此例程在原始图像中找到模板图像:
private Point Detect_object(
Image<Gray, Byte> Area_Image,
Image<Gray, Byte> image_object )
{
//Work out padding array size
Point dftSize = new Point( Area_Image.Width + ( image_object.Width * 2 ), Area_Image.Height + ( image_object.Height * 2 ) );
//Pad the Array with zeros
using ( var pad_array = new Image<Gray, Byte>( dftSize.X, dftSize.Y ) )
{
//copy centre
pad_array.ROI = new Rectangle( image_object.Width, image_object.Height, Area_Image.Width, Area_Image.Height );
CvInvoke.cvCopy( Area_Image, pad_array, IntPtr.Zero );
pad_array.ROI = ( new Rectangle( 0, 0, dftSize.X, dftSize.Y ) );
//Match Template
using ( var result_Matrix = pad_array.MatchTemplate( image_object, TemplateMatchingType.CcoeffNormed ) )
{
Point[] MAX_Loc, Min_Loc;
double[] min, max;
//Limit ROI to look for Match
result_Matrix.ROI = new Rectangle( image_object.Width, image_object.Height, Area_Image.Width - image_object.Width, Area_Image.Height - image_object.Height );
result_Matrix.MinMax( out min, out max, out Min_Loc, out MAX_Loc );
_location = new Point( ( MAX_Loc[ 0 ].X ), ( MAX_Loc[ 0 ].Y ) );
var Results = result_Matrix.Convert<Gray, Double>();
return _location;
}
}
}
我这样称呼:
Image<Bgr, Byte> My_Image = new Image<Bgr, Byte>("d:\\original.jpg");
Image<Gray, Byte> My_Image_Gray = My_Image.Convert<Gray, Byte>();
Image<Gray, Byte> Template = new Image<Gray, Byte>("d:\\template.jpg");
var pt = Detect_object( My_Image_Gray, Template );
My_Image.Draw(new CircleF(new PointF(pt.X, pt.Y), 10), new Bgr(0, 0, 255));
My_Image.Save("D:\\result.jpg");
现在可以正常工作了。
所以,我想,如果我有一堆不同角度和光照的模板,那么我可以尝试做自己的分类器(以某种方式-我需要研究如何做)
但是首先,我想让我们减小原始图像的大小并重新运行代码。
这次没有找到模板。
模板匹配也按尺寸进行吗?如果是这样,我还能探索什么其他技术?
谢谢