OpenCV affine conversion will not be performed

I am trying to do a basic affine transformation using pivot points.

import cv2 import numpy as np import PIL import matplotlib.pyplot as plt img = cv2.imread('earth.png') img_pivots = cv2.imread('earth_keys.png') map_img = cv2.imread('earth2.png') map_pivots = cv2.imread('earth2_keys.png') pts_img_R = np.transpose(np.where(img_pivots[:, :, 2] > 0 )) pts_img_G = np.transpose(np.where(img_pivots[:, :, 1] > 0 )) pts_img_B = np.transpose(np.where(img_pivots[:, :, 0] > 0 )) pts_img = np.vstack([pts_img_R, pts_img_G, pts_img_B]) pts_map_R = np.transpose(np.where(map_pivots[:, :, 2] > 0 )) pts_map_G = np.transpose(np.where(map_pivots[:, :, 1] > 0 )) pts_map_B = np.transpose(np.where(map_pivots[:, :, 0] > 0 )) pts_map = np.vstack([pts_map_R, pts_map_G, pts_map_B]) M = cv2.estimateRigidTransform(pts_map.astype(np.float32), pts_img.astype(np.float32), True) dst = cv2.warpAffine(map_img,M,(img.shape[1], img.shape[0])) plt.subplot(121),plt.imshow(img),plt.title('earth.png') plt.subplot(122),plt.imshow(dst),plt.title('earth2.png transrofmed') plt.show() 

On both images I made 3 dots (R, G and B) and saved them in separate images ("earth_keys.png" for "earth.png" and "earth2_keys.png" for "earth2.png"). All I want is to align the pivot points on "earth2.png" with the anchor points on "earth.png".

However, all I get after the conversion is enter image description here

I suppose I missed some arguments or something like this, but I tried all the combinations and got all kinds of wrong results, but still can't determine it.

Image Examples (with summaries)

Edit: Changed speed to 6

Still wrong conversion enter image description here

M is now equal

  array([[ 4.33809524e+00, 8.28571429e-01, -5.85633333e+02], [ -6.22380952e+00, -1.69285714e+00, 1.03468333e+03]]) 

Example with 6 anchor points

+7
python image image-processing opencv
source share
1 answer

How confident are you in your reference points?

If I draw them on your images, I get the following: Reference points

Which gives, after a manual superposition, something similar to your result: Manual Superposition

If I manually define points for three matches, I get the following:

 pts_img = np.vstack([[68,33], [22,84], [113,87]] ) pts_map = np.vstack([[115,101], [30,199], [143,198]]) 

Result for Hand Points

This is still not perfect, but it may be closer to what you want to achieve.

In conclusion, I would recommend checking how you calculate your key points , and if in doubt, perform a manual superposition .

+5
source share

All Articles