作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用枢轴点执行基本的仿射变换。
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)并将它们保存在单独的图片中(“earth.png”为“earth_keys.png”,“earth2.png”为“earth2_keys.png”)。我只想将“earth2.png”上的枢轴点与“earth.png”上的枢轴点相匹配。
我假设我放错了一些参数或类似的东西,但我尝试了所有组合并得到了所有类型的错误结果,但仍然无法发现它。
编辑:将枢轴数更改为 6
M 现在等于
array([[ 4.33809524e+00, 8.28571429e-01, -5.85633333e+02],
[ -6.22380952e+00, -1.69285714e+00, 1.03468333e+03]])
最佳答案
您对自己的枢轴点有多自信?
如果我为 3 个对应关系手动定义点,我会得到:
pts_img = np.vstack([[68,33], [22,84], [113,87]] )
pts_map = np.vstack([[115,101], [30,199], [143,198]])
它仍然不完美,但它可能更接近您想要实现的目标。
最后,我建议您检查您如何计算关键点,如有疑问,进行手动叠加。
关于python - OpenCV 仿射变换不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37099602/
我是一名优秀的程序员,十分优秀!