Детектування об'єктів застосовуєься у багатьох галузях. Адже, можливість автоматичного пошуку
об'єктів значно спрощує обробку зображення чи відео.
В процесі роботи шаблонне зображення послідовно накладається на досліджуване зображення і
між ними вираховується кореляція. Результат кореляції заноситься у вихідне зображення.
Наприклад, маємо шаблон для пошуку
та вхідне зображення
У результаті пошуку за шаблоном отримаємо результат:
Як бачимо, наша програма впоралась із завданням. Тепер змінимо колір досліджувального зображення і глянемо на результат:
Як бачимо, колір елементу не впливає на якість розпізнавання. У реальному житті зображення піддаються впливу різного роду шумів. Що ж, спеціально зашумимо зображення імпульсним шумом та глянемо на результат:
Особливих труднощів у розпізнаванні фігури не виникло. Тепер спробуйте знайти панду на наступному зображенні:
Впевнений, Вам це вдалось. Глянемо як з цим впоравася 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