четверг, 4 июня 2015 г.

2. Тестируем возможности opencv на обученном каскаде



Описание Алгоритмов для работы с тем или иным подходом работы с opencv мы можем найти во встроенной документации  по пути <путь до opencv>\sources\doc\py_tutorials\

У меня этот путь C:\opencv\sources\doc\py_tutorials\
В дальнейшем описания буду использовать свой путь до файлов opencv.

Пример работы с определением лиц описан в фалах следующей папки: 
C:\opencv\sources\doc\py_tutorials\py_objdetect\py_face_detection
В указанной папке увидим файл py_face_detection.rst, в котором находится текстовое описание подхода.


Для определения возьмем какое-либо лицо. Я взял по следующему пути:
С:\opencv\sources\samples\java\clojure\simple-sample\resources\images\lena.png



Теперь, собственно, откроем netbeans, создадим проект, подключим к нему библиотеку openCV как описано в предыдущем посте.
Добавим в созданный проект помимо класс Detector, со следующим кодом (описание кода в комментариях):

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
/**
 * Определение лиц.
 * @author brudanovom
 */
public class Detector {
    public void DetectFace(){
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME ); //Инициализируем библиотеки
/*подгружаем обученный классификатор Хаара*/
String CascadePath;
CascadePath = "c:\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml";
CascadeClassifier faceDetector = new CascadeClassifier(CascadePath);
//Задаем путь до картинки с лицом
String ImagePath = new String("c:\\opencv\\sources\\samples\\java\\clojure\\simple-sample\\resources\\images\\lena.png");
System.out.println(ImagePath);
Mat image = Highgui.imread(ImagePath);
        // Определяем наличие лиц на фото
        MatOfRect faceDetections = new MatOfRect();// MatOfRect специальный контейнер прямоугольников типа Rect
        faceDetector.detectMultiScale(image, faceDetections);//непосредственно функция определения
        System.out.println(String.format("Detected %s faces", faceDetections.toArray().length)); //Выводим результаты определения в консоль
        // Рисуем определившиеся прямоугольники на картинке
        for (Rect rect : faceDetections.toArray()) {
            Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x
                    + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));           
        }
        String filename = "c:\\DOWNLOADS\\faceDetection.png"; // Задаем путь для сохранения результатов
        System.out.println(String.format("Writing %s", filename)); //Пишем о сохранении в консоль
        Highgui.imwrite(filename, image);// Сохраняем результат определения лиц
    }
}


Теперь используем созданный класс в функции Main:



public static void main(String[] args) {
        Detector d = new Detector();
       d.DetectFace();
    }

Результат сохранится в виде следующей картинки:



Итак, в результате мы получили представление об использовании библиотеки opencv для программирования в java, попутно разработав простенькую программку для определения лиц на фотографии. Названия классов и функций библиотеки в разных версиях opencv могут отличаться. При разработке не ленитесь смотреть туториалы, входящие в состав opencv.

 

Комментариев нет:

Отправить комментарий