Python OpenCV - как найти ТОЛЬКО вращение и перемещение, необходимые для выравнивания двух изображений по двум наборам точек?(без аффинности, без деформации) - PullRequest
0 голосов
/ 02 января 2019

У меня есть два набора совпадающих точек, например.

# first set of points
[[696.0, 971.3333333333334], [1103.3333333333333, 934.6666666666666], ...]
# second set of points
[[475.0, 458.6666666666667], [1531.3333333333333, 524.0], ...]

из двух изображений. Прямо сейчас я использую этот кусок кода для выравнивания изображений:

points_source = np.array(source_coordinates)
points_destination = np.array(destination_coordinates)

h, status = cv2.findHomography(points_destination, points_source, cv2.RANSAC)
aligned_image = cv2.warpPerspective(destination_image, h, (source_image.shape[1], source_image.shape[0]))

Большую часть времени он работает хорошо, но иногда искажает изображение и плохо выравнивает. Я нашел estimateRigidTransform функцию, которая была бы лучшей для меня, потому что возможно только перевести и повернуть изображение, но оно устарело, и когда я пытаюсь использовать его, оно выдает ошибку:

Traceback (most recent call last):
  File "align.py", line 139, in <module>
    align(image, image2, source_coordinates, destination_coordinates)
  File "align.py", line 111, in align
    m = cv2.estimateRigidTransform(points_destination, points_source, fullAffine=False)
AttributeError: module 'cv2' has no attribute 'estimateRigidTransform'

Я не смог найти другого решения, кроме estimateRigidTransform. Есть ли другая функция, которая будет работать для меня? Может быть, я могу использовать warpPerspective только для изменения поворота и перевода? Я не хочу использовать функцию getAffineTransform, потому что она может принимать только три балла, и я хочу использовать гораздо больше баллов. Моя версия OpenCV 4.0.1-1

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Мне нужна была функция: cv2.estimateAffinePartial2D()

0 голосов
/ 03 января 2019

Вместо использования простого OpenCV, я бы порекомендовал связать ваш проект с другой библиотекой, в которой есть алгоритмы, которые вы ищете (и многое другое). Вероятно, лучшим решением будет Библиотека Insight Toolkit (ITK) или Visual Toolkit (VTK) . Первый вариант гораздо сложнее и сложнее в изучении, но последний на самом деле очень прост. Они оба используют CMake, и нет проблем при компиляции / компоновке и т. Д.

ITK специально разработан для обработки изображений. Он включает в себя так называемую регистрацию на основе Landmark , которая является именно тем, что вам нужно. Полный рабочий пример: доступно . К сожалению, библиотека кажется очень сложной в начале.

С другой стороны, VTK также реализует тот же алгоритм, но его можно использовать очень просто ( из примера ):

vtkSmartPointer<vtkLandmarkTransform> landmarkTransform = vtkSmartPointer<vtkLandmarkTransform>::New();
landmarkTransform->SetSourceLandmarks(sourcePoints);
landmarkTransform->SetTargetLandmarks(targetPoints);
landmarkTransform->SetModeToRigidBody();
landmarkTransform->Update();
std::cout << landmarkTransform->GetMatrix() << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...