Выравнивание двух изображений с использованием евклидовой модели движения: итерации не сходятся
В рамках проекта колледжа я пытаюсь найти разницу между двумя изображениями с помощью реализации Python OpenCV. Изображения не выровнены должным образом, поэтому я пытаюсь сначала выровнять их, используя описанный здесь метод. Это мой код:
import cv2
import numpy as np
# Read the images to be aligned
im1 = cv2.imread("card-without-logo-with-background-translated.jpg")
im2 = cv2.imread("card-without-logo-with-background-translated-rotated.jpg")
# Convert images to grayscale
im1_gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
im2_gray = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY)
# Find size of image1
sz = im1.shape
# Define the motion model
warp_mode = cv2.MOTION_EUCLIDEAN
# Define 2x3 or 3x3 matrices and initialize the matrix to identity
if warp_mode == cv2.MOTION_HOMOGRAPHY:
warp_matrix = np.eye(3, 3, dtype=np.float32)
else:
warp_matrix = np.eye(2, 3, dtype=np.float32)
# Specify the number of iterations.
number_of_iterations = 5000
# Specify the threshold of the increment
# in the correlation coefficient between two iterations
termination_eps = 1e-10
# Define termination criteria
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, number_of_iterations, termination_eps)
# Run the ECC algorithm. The results are stored in warp_matrix.
(cc, warp_matrix) = cv2.findTransformECC(im1_gray, im2_gray, warp_matrix, warp_mode, criteria)
if warp_mode == cv2.MOTION_HOMOGRAPHY:
# Use warpPerspective for Homography
im2_aligned = cv2.warpPerspective(im2, warp_matrix, (sz[1], sz[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)
else:
# Use warpAffine for Translation, Euclidean and Affine
im2_aligned = cv2.warpAffine(im2, warp_matrix, (sz[1], sz[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)
Изображение я пытаюсь выровнять по ссылке.
я использовал cv2.MOTION_EUCLIDEAN
потому что изображение, которое я хочу выровнять, переведено и повернуто.
Когда я запускаю этот код, я получаю следующую ошибку:
OpenCV Error: Iterations do not converge (The algorithm stopped before its convergence. The correlation is going to be minimized. Images may be uncorrelated or non-overlapped) in cv::findTransformECC, file C:\projects\opencv-python\opencv\modules\video\src\ecc.cpp, line 540
Traceback (most recent call last):
File "...Image_alignment.py", line 43, in <module>
(cc, warp_matrix) = cv2.findTransformECC(im1_gray, im2_gray, warp_matrix, warp_mode, criteria)
cv2.error: C:\projects\opencv-python\opencv\modules\video\src\ecc.cpp:540: error: (-7) The algorithm stopped before its convergence. The correlation is going to be minimized. Images may be uncorrelated or non-overlapped in function cv::findTransformECC
Не могли бы вы уточнить, что означает сообщение об ошибке, и является ли мой подход правильным для такого типа проблемы?
PS При работе с переведенным (только) изображением, используя cv2.MOTION_TRANSLATION
работал отлично.