#python #opencv
Вопрос:
Я следую этому учебнику по выравниванию изображений с помощью OpenCV. Там не было части с распознаванием лиц, поэтому я добавил ее сам.
import cv2
import numpy as np
import dlib
from PIL import Image
MAX_FEATURES = 500
GOOD_MATCH_PERCENT = 0.15
def extract_bounding_points(rect):
bl_corner = rect.bl_corner()
tr_corner = rect.tr_corner()
return [(bl_corner.x,bl_corner.y ), (tr_corner.x,tr_corner.y )]
def get_face(im):
hogFaceDetector = dlib.get_frontal_face_detector()
faceRect = hogFaceDetector(im, 0)[0]
face = im[faceRect.top() : faceRect.bottom(), faceRect.left() : faceRect.right()]
return face
def alignImages(im1, im2, resize=True):
# Convert images to grayscale
im1Gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
im2Gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
faceImg1 = get_face(im1Gray)
faceImg2 = get_face(im2Gray)
coloredFace1 = get_face(im1)
coloredFace2 = get_face(im2)
if resize:
height, width = faceImg1.shape
faceImg1 = cv2.resize(faceImg1, (height * 2, width * 2))
coloredFace1 = cv2.resize(coloredFace1, (height * 2, width * 2))
height, width = faceImg2.shape
faceImg2 = cv2.resize(faceImg2, (height * 2, width * 2))
coloredFace2 = cv2.resize(coloredFace2, (height * 2, width * 2))
# Detect AKAZE features and compute descriptors.
akaze = cv2.AKAZE_create(MAX_FEATURES)
keypoints1, descriptors1 = akaze.detectAndCompute(faceImg1, None)
keypoints2, descriptors2 = akaze.detectAndCompute(faceImg2, None)
# Match features.
matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_HAMMING)
matches = matcher.match(descriptors1, descriptors2, None)
# Sort matches by score
matches.sort(key=lambda x: x.distance, reverse=False)
# Remove not so good matches
numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT)
matches = matches[:numGoodMatches]
# Draw top matches
imMatches = cv2.drawMatches(coloredFace1, keypoints1, coloredFace2, keypoints2, matches, None)
cv2.imwrite("results/matches.jpg", imMatches)
# Extract location of good matches
points1 = np.zeros((len(matches), 2), dtype=np.float32)
points2 = np.zeros((len(matches), 2), dtype=np.float32)
for i, match in enumerate(matches):
points1[i, :] = keypoints1[match.queryIdx].pt
points2[i, :] = keypoints2[match.trainIdx].pt
# Find homography
h, mask = cv2.findHomography(points1, points2, cv2.RANSAC)
# Use homography
height, width, channels = im2.shape
im1Reg = cv2.warpPerspective(im1, h, (width, height))
return im1Reg, h
# Read reference image
refFilename = "data/original.jpg"
print("Reading reference image : ", refFilename)
imReference = cv2.imread(refFilename, cv2.IMREAD_COLOR)
# Read image to be aligned
imFilename = "data/rotated.jpg"
print("Reading image to align : ", imFilename);
im = cv2.imread(imFilename, cv2.IMREAD_COLOR)
print("Aligning images ...")
# Registered image will be resotred in imReg.
# The estimated homography will be stored in h.
imReg, h = alignImages(im, imReference)
# Write aligned image to disk.
outFilename = "results/aligned.jpg"
print("Saving aligned image : ", outFilename);
cv2.imwrite(outFilename, imReg)
# Print estimated homography
print("Estimated homography : n", h)
но я продолжаю получать следующую ошибку
ошибка: OpenCV(4.1.2) /io/opencv/модули/функции 2d/src/kaze/AKAZEFeatures.cpp:1295: ошибка: (-215:Утверждение не выполнено) y0 — 6 * масштаб >= 0 amp;amp; y0 6 * масштаб >
при выполнении keypoints1, descriptors1 = akaze.detectAndCompute(faceImg1, None)
Я предположил, что это как-то связано с размером изображений, поэтому я добавил часть с resize
if resize:
height, width = faceImg1.shape
faceImg1 = cv2.resize(faceImg1, (height * 2, width * 2))
coloredFace1 = cv2.resize(coloredFace1, (height * 2, width * 2))
height, width = faceImg2.shape
faceImg2 = cv2.resize(faceImg2, (height * 2, width * 2))
coloredFace2 = cv2.resize(coloredFace2, (height * 2, width * 2))
Я также проверил, что размеры изображений лиц равны и что изображения загружены правильно. Так как же я могу это исправить?
Ответ №1:
MAX_FEATURES
аргумент AKAZE_create
» о » не является допустимым аргументом.
Смотрите документацию AKAZE_create:
retval = cv.AKAZE_create( [, описание_тип[, описание_размер[, описание_каналы[, порог[, ночные волны[, ночные слои[, диффузия]]]]]]])
Заменить akaze = cv2.AKAZE_create(MAX_FEATURES)
на:
akaze = cv2.AKAZE_create()
Примечание:
Я не могу найти способ ограничить количество ключевых точек AKAZE.
Я думаю, что нет возможности ограничить количество ключевых точек AKAZE (например, в отличие от SIFT).