2016-05-08 38 views
7

Tôi đang cố gắng thực hiện chuyển đổi affine cơ bản bằng cách sử dụng các điểm pivot.Biến đổi affine OpenCV sẽ không thực hiện

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

Trên cả hình ảnh tôi đã thực hiện được 3 điểm (R, G & B) và lưu chúng trong hình ảnh riêng biệt ('earth_keys.png' cho 'earth.png' và 'earth2_keys.png' cho 'earth2.png '). Tất cả những gì tôi muốn là khớp các điểm pivot trên 'earth2.png' với các điểm pivot trên 'earth.png'.

Tuy nhiên, tất cả tôi nhận được sau khi chuyển đổi được này enter image description here

Tôi giả định rằng tôi bị thất lạc một số đối số hoặc một cái gì đó như thế này, nhưng tôi đã cố gắng tất cả các kết hợp và nhận được tất cả các loại kết quả sai, nhưng vẫn có thể' t phát hiện nó.

Example images (with pivots)

Edit: trụ đã thay đổi số để 6

chuyển đổi Tuy nhiên sai enter image description here

M bây giờ bằng

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

Example with 6 pivots

+0

bạn có thể thử sử dụng hơn 3 điểm không? có các hình thức cứng nhắc cho phép tối thiểu 3 điểm, nhưng openCV có tham số "fullAffine". Nếu điều này được thiết lập, tôi nghĩ rằng có nhiều hơn 6 dof. Bạn có thể cho chúng tôi biết giá trị kết quả của M không? – Micka

+0

chỉ cần kiểm tra .. 6dof nên ok cho fullAffine nên 3 cặp điểm nên được ok. vui lòng in và thêm M – Micka

+0

Đã thêm 3 điểm xoay khác và chỉnh sửa câu hỏi, vẫn có điều gì đó sai. Bạn đang sử dụng cùng một mã? – arkhy

Trả lời

5

Bạn tự tin về điểm mấu chốt của mình ở mức nào?

Nếu tôi vẽ chúng trên hình ảnh của bạn, tôi có được điều này: Plotting points

Mà cho, sau khi chồng chất dẫn sử dụng, cái gì đó trông giống như kết quả của bạn: Manual superposition

Nếu tôi xác định điểm bằng tay trong vòng 3 thư từ, tôi có được điều này:

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

Result for manual points

Nó vẫn không hoàn hảo, nhưng nó có thể gần hơn với những gì bạn muốn đạt được.

Để kết luận, tôi muốn khuyên bạn nên kiểm tra cách bạn tính toán keypoint bạn, và, trong trường hợp nghi ngờ, để làm một sự chồng chất của nhãn hiệu.

Các vấn đề liên quan