2013-07-17 74 views
4

我想從一個梯形(在第一個圖像)到一個矩形(在第二個圖像),但得到一個奇怪的結果(在第三個圖像)。OpenCV透視變換給予意想不到的效果

enter image description here

我的計劃是使用透視變換,通過梯形的四個拐角點和矩形的四個角點限定。

在這個例子中,對於梯形它們是:

ptsTrap = [[ 50.   100.  ] 
      [ 50.   200.  ] 
      [ 250.   64.73460388] 
      [ 250.   235.26539612]] 

和用於矩形:

ptsRect = [[ 50. 100.] 
      [ 50. 200.] 
      [ 250. 100.] 
      [ 250. 200.]] 

我得到一個透視從這些點變換:

T = cv2.getPerspectiveTransform(ptsTrap, ptsRect) 

然後從那裏建立圖像:

arrTrapToRect = cv2.warpPerspective(arrTrap, T, arrTrap.shape[:2]) 

但是,正如您從圖像中看到的,這並沒有給出預期的轉換。

我似乎無法弄清楚爲什麼即使定義轉換的點也沒有按照它進行投影。有任何想法嗎?

回答

7

您的方法是正確的。當您指定角點的座標時會出現問題。我不知道你如何計算它們,但是你已經交換了X軸和Y軸。這反映在應用於最終圖像的轉換中。我找到的角點是:

ptsTrap = [[[ 99. 51.]] 
      [[ 64. 251.]] 
      [[ 234. 251.]] 
      [[ 199. 51.]]] 

ptsRect = [[[ 102. 49.]] 
      [[ 100. 249.]] 
      [[ 200. 250.]] 
      [[ 200. 50.]]] 

尋找角度,從這些點變換給出正確的結果: Perspective Transform result

供參考,這是我使用的代碼:

import cv2 
import numpy as np 

def find_corners(image): 
    im = cv2.Canny(image, 100, 200) 

    cnt = cv2.findContours(im,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0] 
    cnt = cv2.approxPolyDP(cnt[0], 5, True) 
    return cnt.astype(np.float32) 

def main(argv): 
    trap = cv2.imread('trap.png', cv2.IMREAD_GRAYSCALE) 
    rect = cv2.imread('rect.png', cv2.IMREAD_GRAYSCALE) 

    ptsTrap = find_corners(trap) 
    ptsRect = find_corners(rect) 

    T = cv2.getPerspectiveTransform(ptsTrap, ptsRect) 

    warp = cv2.warpPerspective(trap, T, rect.shape[:2]) 

    cv2.imshow('', warp) 
    cv2.imwrite('warp.png', warp) 
    cv2.waitKey() 
    cv2.destroyAllWindows() 
+0

謝謝那確實是問題所在。我自己在製作圖片,而我犯了愚蠢的錯誤,把x,y當作我,j而不是j,i。現在看起來不錯! – sapi