Ошибка OpenCV(4.1.0): (-215:Ошибка утверждения) y0 — 6 * масштаб >= 0

#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).