2016-05-08 11 views
7

Sto tentando di eseguire la trasformazione affine di base utilizzando i punti pivot.La trasformazione affine OpenCV non verrà eseguita

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

Su entrambe le immagini sono fatto 3 punti (R, G & B) e salvate in immagini separate ('earth_keys.png' per 'Earth.png' e 'earth2_keys.png' per 'earth2.png '). Tutto quello che voglio è far corrispondere i punti di pivot su "earth2.png" con i punti pivot su "earth.png".

Eppure, tutto quello che ottiene dopo la trasformazione è questo enter image description here

Sto assumendo che ho smarrito alcuni argomenti o qualcosa di simile, ma ho provato tutte le combinazioni e ottenuto tutti i tipi di risultati sbagliati, ma ancora in grado di' Lo vedo.

Example images (with pivots)

Edit: perni modificate numero 6

trasformazione Still errata enter image description here

M è ora uguale

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

Example with 6 pivots

+0

puoi provare a utilizzare più di 3 punti? ci sono forme rigide che consentono un minimo di 3 punti, ma openCV ha un parametro "fullAffine". Se questo è impostato, penso che ci siano più di 6 dof. Puoi dirci anche i valori di risultato di M? – Micka

+0

appena controllato .. 6dof dovrebbe essere ok per fullAffine quindi 3 coppie di punti dovrebbero essere ok. per favore stampa e aggiungi M – Micka

+0

Aggiunti altri 3 perni e modificato la domanda, ancora qualcosa non va. Stai usando lo stesso codice? – arkhy

risposta

5

Quanto sei sicuro nei tuoi punti di snodo?

Se li tracciare sulle immagini, ottengo questo: Plotting points

che dà, dopo sovrapposizione manuale, qualcosa che assomiglia il risultato: Manual superposition

Se definisco punti manualmente per 3 corrispondenze, ottengo questo:

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

Result for manual points

Non è ancora perfetto, ma potrebbe essere più vicino a ciò che si desidera ottenere.

Per concludere, vi consiglio di assegno come calcolare la keypoints, e, in caso di dubbio, ad fare una sovrapposizione manuale di.

Problemi correlati