Автор оригинала: Shashwat Jain.
OpenCV -это библиотека функций программирования, в основном направленных на компьютерное зрение в реальном времени. Эта статья направлена на обнаружение лиц на изображении с использованием OpenCV и Python/C++.
Предварительные требования: Базовые знания программирования на Python и C++, OpenCV, Python и C++, установленный на машине, редактор кода.Вот и все…Теперь ты можешь идти…
Для обнаружения лиц в нашем коде мы будем использовать Haar-cascade Detection в OpenCV. Обнаружение объектов с использованием каскадных классификаторов на основе признаков Haar является эффективным методом обнаружения объектов. Это подход, основанный на машинном обучении, при котором каскадная функция обучается из множества положительных и отрицательных изображений. Затем он используется для обнаружения объектов на других изображениях. OpenCV уже содержит множество предварительно обученных классификаторов для лица, глаз, улыбки и т. Д. Эти XML – файлы хранятся в папке opencv/data/haarcascades/ .
Давайте сначала начнем писать код на Python, а затем продолжим с C++.
Python: Начните с импорта модуля numpy и модуля opencv.
импорт numpy как np
импорт cv2 как cv
Теперь мы будем использовать следующий каскадный классификатор Хаара для нашего кода распознавания лиц. haarcascade_frontalface_default.xml – Предварительно обученная модель для распознавания лиц
Давайте загрузим эти каскады в наш код.
face_cascade.CascadeClassifier('\\cv2\\data\\haarcascade_frontalface_default.xml')
eye_cascade.CascadeClassifier('\\cv2\\data\\haarcascade_eye.xml')
Теперь нам нужно загрузить изображение, в котором мы хотим запустить наш алгоритм распознавания лиц. Для этой статьи мы будем использовать традиционное изображение OpenCV “ленна” следующим образом.
Загрузите это изображение в свой код и преобразуйте его в оттенки серого. img.imread('lenna.jpg')
gray.cvtColor(img, cv.COLOR_BGR2GRAY)
Теперь наше изображение готово к нанесению каскада лиц. Мы используем функцию detectMultiScale для обнаружения лиц на изображении вместе с нашим каскадом обнаружения лиц, который мы загрузили ранее в нашем коде.
faces.detectMultiScale(серый, 1.3, 5)
Здесь 1.3 – масштабный коэффициент, а 5-соседние районы. scaleFactor – Параметр, указывающий, насколько уменьшается размер изображения при каждом масштабе изображения. minNeighbors – Параметр, указывающий, сколько соседей должно быть у каждого прямоугольника-кандидата, чтобы сохранить его.
Теперь распознавание лиц выполнено, и все лица, найденные на изображении, хранятся в массиве faces . Теперь давайте нарисуем прямоугольники вокруг обнаруженных лиц на нашем изображении.
для (x,y,w,h) в гранях:
cv.прямоугольник(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray[y:y+h, x:x+w]
roi_color[y:y+h, x:x+w]
Мы почти закончили с нашим кодом распознавания лиц, и нам просто нужно показать наше новое изображение с обнаруженными лицами. Для этого у нас есть следующий фрагмент кода.
cv.imshow('Face_Detect',img)
cv.waitKey(0)
cv.destroyAllWindows()
Это результирующее изображение, которое мы получаем в соответствии с нашим входным изображением.
Вот и все. Мы успешно обнаружили лица на изображении с помощью OpenCV и Python. Теперь попробуйте обнаружить различные объекты, используя различные каскады Хаара в библиотеке OpenCV. Ну, вы даже можете сделать свой собственный каскад Хаара! При условии, что у вас есть много фотографий вашего целевого объекта. Однако это выходит за рамки данной статьи.
C++: Давайте включим все необходимые заголовки для нашего кода:
#включить "opencv2/objdetect.hpp"
#включить "opencv2/highgui.hpp"
#включить "opencv2/imgproc.hpp"
#включить
использование пространства имен std;
использование пространства имен cv;
objdetect.hpp – Модуль обнаружения объектов в OpenCV.
highgui.hpp – Он обеспечивает простой интерфейс для:
Создание и управление окнами, которые могут отображать изображения Добавление панелей треков в окна Чтение и запись изображений на/с диска или памяти. Считывание видео с камеры или файла и запись видео в файл.
imgproc.hpp – Он предоставляет множество функций для обработки изображений, таких как фильтрация изображений и геометрические преобразования.
Теперь мы пишем функцию, которая принимает входное изображение и каскадный классификатор в качестве аргумента и выдает выходное изображение после применения алгоритма распознавания лиц.
void detectAndDraw( Mat& img, CascadeClassifier& cascade, двойная шкала)
Это наше определение функции, и мы продолжаем писать тело функции. Сначала мы инициализируем вектор для хранения всех лиц, которые наш алгоритм обнаружит, и преобразуем наше входное изображение в оттенки серого.
вектор лица;
Матовый серый;
cvtColor( img, серый, COLOR_BGR2GRAY );
Теперь мы применим функцию detectMultiScale к нашему изображению в оттенках серого.
cascade.detectMultiScale( серый, грани, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Размер(30, 30) );
Эта функция похожа на то, что мы использовали в python. Теперь распознавание лиц завершено, и нам нужно нарисовать прямоугольники вокруг обнаруженных лиц.
for ( size_t; i < faces.size(); i++ )
{
Rect[i];
Скаляр(255, 0, 0);
прямоугольник( img, cvPoint(cvRound(r.x*масштаб), cvRound(r.y*масштаб)), cvPoint(cvRound((r.x +
r.width-1)*масштаб), cvRound((r.y + r.height-1)*масштаб)), цвет, 3, 8, 0);
}
Теперь нам просто нужно показать наш результат следующим образом.
imshow( “Распознавание лиц”, img );
Вот и все, теперь мы можем просто вызвать нашу функцию обнаружения и получить лица, обнаруженные на ходу.
int main()
{
//Загрузить каскадный классификатор
cascade.load( "../../haarcascade_frontalcatface.xml" ) ;
двойной;
рамка('lenna.jpg', CV_LOAD_IMAGE_COLOR);
detectAndDraw( кадр, каскад, масштаб );
возврат 0;
}
imread() используется для загрузки входного изображения. В данном случае это тот же образ “ленны”, который мы использовали в коде python.
Результатом для нашего кода C++ является:
Вот и все, мы успешно обнаружили лица на изображении с помощью OpenCV и C++.