You are here: Start » AVL.NET » Adaptive Vision Library .NET Usage » Basic Template Matching Example

Basic Template Matching Example

Following example creates a reusable EdgeModel object with the CreateEdgeModel function that is used to locate some objects in the loaded image. Locating objects is performed with LocateMultipleObjects_Edges function and the found bounding rectangles used to calculate bounding circles, which are drawn into the loaded image with DrawCircle. If no object is found, appropriate message is drawn with DrawString function.

To have the example work, a single form with PictureBox control is needed.

//...
using System.Linq;

using AvlNet;
    //...

    public partial class Form1 : Form
    {
        EdgeModel model = null;
        DrawingStyle style;

        public Form1()
        {
            InitializeComponent();

            style = new DrawingStyle() { Thickness = 2.0f, Opacity = 1.0f };
            CreateModel();
            MatchModel();
        }

        
        private void CreateModel()
        {
            Image modelImage;
            AVL.LoadImage("mount.jpg", false, out modelImage);
            AVL.CreateEdgeModel(modelImage, 0, 0.0f, 35.0f, 15.0f, 0.0f, 360.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, out model);
            modelImage.Dispose();
        }

        private void MatchModel()
        {
            Image inspectingImage;
            Object2D[] matches;

            AVL.LoadImage("mounts.jpg", false, out inspectingImage);

            AVL.LocateMultipleObjects_Edges(inspectingImage, model, 0, 10.0f, false, false, 0.8f, 20.0f, out matches);
            if (matches.Length > 0)
            {
                //extract rectangles from the found matches
                Rectangle2D[] rectangles = matches.Select<Object2D, Rectangle2D>(obj => obj.Match).ToArray();

                Circle2D?[] boundingCircles = new Circle2D?[rectangles.Length];
                
                //get bounding circles for the matched rectangles
                for (int i = 0; i < rectangles.Length; i++)
                {
                    Path rectPath;
                    AVL.CreateRectanglePath(rectangles[i], out rectPath);
                    Circle2D boundingCircle;
                    AVL.PathBoundingCircle(rectPath, out boundingCircle);
                    boundingCircles[i] = boundingCircle;
                }

                for (int i = 0; i < boundingCircles.Length; i++)
                {
                    if (boundingCircles[i].HasValue)
                        AVL.DrawCircle(
                            ref inspectingImage,
                            boundingCircles[i].Value,
                            new Pixel(0.0f, 255.0f, 0.0f, 255.0f), style);
                }
            }
            else
            {
                AVL.DrawString(
                    ref inspectingImage,
                    "No object found",
                    new Location(inspectingImage.Width / 2, inspectingImage.Height / 2),
					Anchor2D.MiddleCenter, 
                    new Pixel(255.0f, 0.0f, 0.0f, 255.0f),
                    style, 40.0f, 0.0f);
            }

            pictureBox1.Image = inspectingImage.CreateBitmap();

            inspectingImage.Dispose();
        }

        //...
Previous: Basic Image Thresholding Next: Blob Analysis