Категорії
Computer Vision

Пошук об’єкта за шаблоном

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

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

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

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

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

Впевнений, Вам це вдалось. Глянемо як з цим впоравася 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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься.