簡體   English   中英

OpenCV仿射變換不會執行

[英]OpenCV affine transformation won't perform

我正在嘗試使用樞軸點執行基本的仿射變換。

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_keys.png'表示'earth.png'而'earth2_keys.png'表示'earth2.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]])

示例有6個樞軸

你對自己的支點有多大信心?

如果我在你的圖像上繪制它們,我會得到這個: 繪圖點

在手動疊加之后,這給出了一些看起來像你的結果: 手動疊加

如果我手動定義3個對應點,我得到這個:

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

手動點的結果

它仍然不完美,但它可能更接近你想要達到的目標。

最后,我建議您檢查計算關鍵點的方式 ,如有疑問, 請進行手動疊加

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM