Рубрики
Без рубрики

Как обнаружить лица с помощью OpenCV и Python/C++?

Реализация распознавания лиц(OpenCV) в python и C++. Обновленный.

Автор оригинала: 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 “ленна” следующим образом.

Теперь нам нужно загрузить изображение, в котором мы хотим запустить наш алгоритм распознавания лиц. Для этой статьи мы будем использовать традиционное изображение 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++ является:

Результатом для нашего кода C++ является:

Вот и все, мы успешно обнаружили лица на изображении с помощью OpenCV и C++.