Обнаружение / Сегментирование лица и черт лица без использования обученной модели: openCV C ++ - PullRequest
0 голосов
/ 27 июня 2018

Использование одного изображения - я хочу знать, возможно ли определить лицо (объект) и лицевые ориентиры (глаза, рот, нос) на изображении без с использованием некоторой предварительно обученной модели, такой как " haarcascade_eye "или" lbpcascade_frontalface "или что-нибудь связанное. Я хочу обработать лицо на основе отсутствия ввода пользователя, например, выбора области интереса (ROI) вручную с помощью selectROI (). Я пытался сегментировать изображение на основе уроков openCV, но я пытаюсь отделить фон и тело от головы. Я также пытался использовать алгоритмы, такие как SIFT / SURF / FAST, но алгоритм обнаруживает случайные ключевые точки и позже не будет полезен, если я хочу обнаруживать лицевые ориентиры. У кого-нибудь есть пример, учебник, мысли или идеи, которыми он хотел бы поделиться?

Изображение, которое я использую

1 Ответ

0 голосов
/ 27 июня 2018

Я хотел бы отметить, что когда вы запускаете SIFT над изображением, оно покажет вам все «достопримечательности» на этом изображении. Вам необходимо иметь базовое изображение, чтобы сопоставить его, например, для того, чтобы держать обрезанное изображение глаза или любой ориентир лица, на котором вы фокусируетесь.

Ваш код должен будет извлекать ключевые точки как из «поезда», так и из тестовых изображений. Как только вы это сделаете, вы можете использовать соответствующую функцию, такую ​​как BruteForce Matcher или FLANN. После этого определите свой порог для хорошего матча, и вам будет хорошо идти.

Пример:

kp_train,des_train = sift.detectAndCompute(image_train,None)
kp_test,des_test = sift.detectAndCompute(image_test,None)


bf = cv2.BFMatcher()
matches = bf.knnMatch(des_train,des_test,k=2)
good = []
for m,n in matches[index]:
    if m.distance < dist_ratio*n.distance:
        good.append([m])

if len(good)>MIN_MATCH_COUNT:
img3 = cv2.drawMatchesKnn(image_train,keypoints_train,image_test,keypoints_test,good,None, flags=2)
cv2.imwrite("Path/To/Save",img3)

Измените значение MIN_MATCH_COUNT в соответствии с вашей заявкой

Я бы предложил добавить функцию омография и использовать RANSAC , чтобы избавиться от выбросов. При этом вы можете даже нарисовать рамку вокруг своей ROI и извлечь ее.

Альтернативный подход : Вы можете попробовать алгоритм сопоставления с шаблоном, такой как MSTM. Этот алгоритм берет базовое изображение и размещает его на тестовом изображении и проверяет, соответствует ли оно где-либо. Если все ваши изображения будут похожи на те, которые вы прикрепили, MSTM может быть полезен

P.s Довольно очевидно, что я использую Python, вы можете найти эквивалентные функции C ++ в документации opencv

Проверьте это в качестве примера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...