OpenCV仿射变换无法执行

2024-05-15 21:38:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用轴点执行基本的仿射变换。在

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()

在这两张图片上,我都做了3点(R,G&B),并将它们保存在单独的图像中(“地球”)_按键.png'为'地球.png“和”地球2_按键.png'代表'earth2.png')。我只想把“earth2.png”上的轴点与轴点匹配地球.png'. 在

不过,转型后我得到的只是这个 enter image description here

我假设我错放了一些论点或类似的东西,但我尝试了所有的组合,得到了所有类型的错误结果,但仍然无法发现。在

Example images (with pivots)

编辑: 已将轴数更改为6

仍然是错误的转变 enter image description here

M现在等于

^{pr2}$

Example with 6 pivots


Tags: import地球mapimgpngnppltwhere
1条回答
网友
1楼 · 发布于 2024-05-15 21:38:03

你对自己的支点有多自信?

如果我把它们画在你的图像上,我会得到: Plotting points

叠加后的结果是: Manual superposition

如果我为3个对应项手动定义点,则得到:

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

Result for manual points

这还不是完美的,但它可能更接近你想要达到的目标。在

最后,我建议您检查您是如何计算关键点的,如果有疑问,可以手动进行叠加。在

相关问题 更多 >