Вот что я сейчас делаю:
Я загружаю изображение шаблона (GOLD-изображение) и разрешаю пользователю выбрать в нем область интереса.
Я затем используйте cv2.matchTemplate, чтобы найти шаблон в другом изображении (изображение DUT).
После этого я использую AKAZE для обнаружения ключевых точек и дескрипторов, а результаты использую для вычисления матрицы аффинного преобразования с помощью cv2.estimateAffine2D.Наконец, я применяю аффинное преобразование, чтобы выровнять изображение DUT и обрезать совпадающую область.
То, чего я хочу сейчас добиться, — это настроить координаты нескольких ROI с использованием матрицы аффинного преобразования перед обрезкой изображения DUT. По сути, я хочу применить преобразование к ROI, а не преобразовывать все изображение и потом обрезать его.
Можно ли настроить координаты ROI непосредственно с помощью матрицы аффинного преобразования (M), а не чем преобразовывать все изображение? Если да, то как я могу применить это преобразование к каждой рентабельности инвестиций? Могу ли я использовать матричные операции для обновления координат области интереса без преобразования всего изображения?
Вот соответствующий код, который я сейчас использую:
Код: Выделить всё
akaze = cv2.AKAZE_create(threshold=0.0001,
nOctaves=2,
nOctaveLayers=2
)
# Detect keypoints and compute descriptors
keypoints_ref, descriptors_ref = akaze.detectAndCompute(image_ref, None)
keypoints_dut, descriptors_dut = akaze.detectAndCompute(cropped_dut, None)
# Brute force matcher to compare descriptors
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(descriptors_ref, descriptors_dut)
matches = sorted(matches, key=lambda x: x.distance)
# Estimate affine transformation
points_gold = np.array([keypoints_ref[m.queryIdx].pt for m in matches], dtype=np.float32)
points_dut = np.array([keypoints_dut[m.trainIdx].pt for m in matches], dtype=np.float32)
#Affine transformation matrix M is obtained from AKAZE keypoints matching
M, mask = cv2.estimateAffine2D(points_dut, points_gold, method=cv2.RANSAC)
# Example of applying the transformation to the DUT image
aligned_dut_color = cv2.warpAffine(cropped_dut, M, (image_ref.shape[1], image_ref.shape[0]))
# What I need is to apply the transformation to ROI coordinates
# instead of applying it to the whole cropped image.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ois-instea