КАК использовать Гомографию для преобразования изображений в OpenCV?

У меня две картинки (A и B) слегка искажены одна от другой, где между ними есть различия в переводе, ротации и масштабах (например, эти изображения:)

ORIGINAL LENADISTORTED LENA


Ssoooooooo, что мне нужно, - это применить какое-то преобразование в pic B, чтобы он компенсировал искажение/перевод/поворот, который существует, чтобы сделать оба изображения с одинаковым размером, ориентацией и без перевода.

Я уже извлек очки и нашел "Гомографию", как показано ниже. Но я не знаю, как использовать Гомографию для преобразования Mat img_B, чтобы она выглядела как Mat img_A. Любая идея?

//-- Localize the object from img_1 in img_2
std::vector<Point2f> obj;
std::vector<Point2f> scene;

for (unsigned int i = 0; i < good_matches.size(); i++) {
    //-- Get the keypoints from the good matches
    obj.push_back(keypoints_object[good_matches[i].queryIdx].pt);
    scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);
}

Mat H = findHomography(obj, scene, CV_RANSAC);

Приветствия,

Ответ 1

Вам нужна функция warpPerspective. Этот процесс аналогичен тому, который представлен в этом учебнике (для аффинных преобразований и деформаций)

Ответ 2

Вам не нужна гомография для этой проблемы. Вместо этого вы можете вычислить аффинное преобразование. Однако, если вы хотите использовать гомографию для других целей, вы можете проверить код ниже. Он был скопирован из этой подробной статьи о homography,

Пример С++

// pts_src and pts_dst are vectors of points in source 
// and destination images. They are of type vector<Point2f>. 
// We need at least 4 corresponding points. 

Mat h = findHomography(pts_src, pts_dst);

// The calculated homography can be used to warp 
// the source image to destination. im_src and im_dst are
// of type Mat. Size is the size (width,height) of im_dst. 

warpPerspective(im_src, im_dst, h, size);

Пример Python

'''
pts_src and pts_dst are numpy arrays of points
in source and destination images. We need at least 
4 corresponding points. 
''' 
h, status = cv2.findHomography(pts_src, pts_dst)

''' 
The calculated homography can be used to warp 
the source image to destination. Size is the 
size (width,height) of im_dst
'''

im_dst = cv2.warpPerspective(im_src, h, size)