Пошук об'єктів на зображенні за шаблоном засобами OpenCV

Детектування об'єктів застосовуєься у багатьох галузях. Адже, можливість автоматичного пошуку об'єктів значно спрощує обробку зображення чи відео.
В процесі роботи шаблонне зображення послідовно накладається на досліджуване зображення і між ними вираховується кореляція. Результат кореляції заноситься у вихідне зображення. Наприклад, маємо шаблон для пошуку та вхідне зображення

У результаті пошуку за шаблоном отримаємо результат:

Як бачимо, наша програма впоралась із завданням. Тепер змінимо колір досліджувального зображення і глянемо на результат:

Як бачимо, колір елементу не впливає на якість розпізнавання. У реальному житті зображення піддаються впливу різного роду шумів. Що ж, спеціально зашумимо зображення імпульсним шумом та глянемо на результат:

Особливих труднощів у розпізнаванні фігури не виникло. Тепер спробуйте знайти панду на наступному зображенні:

Впевнений, Вам це вдалось. Глянемо як з цим впоравася OpenCV.

Код:

                        
                            import org.opencv.core.Core;
                            import org.opencv.core.Core.MinMaxLocResult;
                            import org.opencv.core.CvType;
                            import org.opencv.core.Mat;
                            import org.opencv.core.Point;
                            import org.opencv.core.Scalar;
                            import org.opencv.highgui.Highgui;
                            import org.opencv.imgproc.Imgproc;

                            class MatchingDemo {

                            /**
                            *
                            * @param inFile  - зображення для пошуку
                            * @param templateFile - елемент пошуку
                            * @param outFile - результат обробки
                            */
                            public void run(String inFile, String templateFile, String outFile) {

                            Mat img = Highgui.imread(inFile);
                            Mat templ = Highgui.imread(templateFile);

                            // / Create the result matrix
                            int result_cols = img.cols() - templ.cols() + 1;
                            int result_rows = img.rows() - templ.rows() + 1;
                            Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);

                            // / Do the Matching and Normalize
                            Imgproc.matchTemplate(img, templ, result, Imgproc.TM_CCOEFF);
                            Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());

                            // / Localizing the best match with minMaxLoc
                            MinMaxLocResult mmr = Core.minMaxLoc(result);
                            Point matchLoc;
                            matchLoc = mmr.maxLoc;
                            Core.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(),
                            matchLoc.y + templ.rows()), new Scalar(0, 255, 0), 4);

                            Core.putText(img, "Found", new Point(matchLoc.x - 60,matchLoc.y - 10),
                            Core.FONT_HERSHEY_COMPLEX, 1.0 ,new  Scalar(0,255,0));

                            Highgui.imwrite(outFile, img);

                            }
                            }
                        
                    
http://stackoverflow.com/questions/17001083/opencv-template-matching-example-in-android