В этом примере показано, как обнаружить поверхности в изображении, или видео при помощи предварительно созданного интерфейса MATLAB® к OpenCV функционируют cv::CascadeClassifier
. Этот пример использует модель обнаружения поверхности Harr, которая обучена инвариантному к масштабу, лобовому обнаружению поверхности. В этом примере вы также используете createMat
служебная функция, чтобы задать массивы ввода и вывода, getImage
служебная функция, чтобы считать выходное изображение, возвращенное функцией OpenCV и rectToBbox
служебная функция, чтобы преобразовать обнаружение поверхности выходной параметр, возвращенный OpenCV, функционирует к координатам ограничительной рамки в MATLAB®.
Считайте видео в рабочее пространство MATLAB при помощи VideoReader
Функция MATLAB.
videoSample = VideoReader("tilted_face.avi");
Добавьте интерфейс MATLAB в имена пакета OpenCV к списку импорта.
import clib.opencv.*; import vision.opencv.util.*;
Задайте имя файла предварительно обученной обученной модели обнаружения поверхности Хаара.
trainedModel = "haarcascade_frontalface_alt.xml";
Загрузите предварительно обученную модель при помощи load
метод OpenCV функционирует cv.CascadeClassifier
.
cascadeClassify = cv.CascadeClassifier(); cascadeClassify.load(trainedModel);
Задайте масштабный коэффициент, чтобы использовать для многошкального обнаружения.
scaleFactor = 1.2;
Выполните эти шаги, чтобы обнаружить поверхности в каждой системе координат при помощи detectMultiScale
метод класса OpenCV cv.CascadeClassifier
.
Создайте Mat
возразите и сохраните входной кадр к Mat
объект при помощи createMat
функция. Задайте Mat
возразите как вход против detectMultiScale
метод.
Создайте массив MATLAB, чтобы представлять класс OpenCV для 2D прямоугольников cv::Rect2i
. Задайте массив как вход к detectMultiScale
метод. Метод использует массив, чтобы возвратить результаты обнаружения.
Экспортируйте результаты обнаружения, возвращенные detectMultiScale
метод к вектору-строке при помощи rectToBbox
функция. Вектор-строка задает координаты ограничительной рамки в индексации на основе одной.
Чертите ограничительные рамки на входном кадре, чтобы представлять обнаруженные поверхности.
count = 1; detections = cell(1,videoSample.NumFrames); while(hasFrame(videoSample)) testFrame = readFrame(videoSample); [inputMat,inputArray] = createMat(testFrame); results = clibArray("clib.opencv.cv.Rect2i", 0); cascadeClassify.detectMultiScale(inputArray,results,scaleFactor); if results.Dimensions ~= 0 detections{count} = rectToBbox(results); else detections{count} = []; end testFrame = insertShape(testFrame,Rectangle=detections{count},LineWidth=5); image(testFrame,Parent=gca); pause(0.01) count = count+1; end
createMat
| getImage
| createUMat
| readFrame
| clibArray
| rectToBbox
| insertShape