Я хотел бы отметить, что когда вы запускаете 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
Проверьте это в качестве примера