2014-12-20 183 views
2

我想將透視變換應用於使用OpenCV的整個圖像。爲此,我首先根據已選擇的點計算初始變換,然後嘗試變換圖像角並將其轉換爲最終的最佳變換。我得到的改造成功,但然後應用cv2.perspectiveTransform()函數總是拋出了這個錯誤:Python打開CV perspectiveTransform()

OpenCV Error: Assertion failed (scn + 1 == m.cols && (depth == CV_32F || depth == CV_64F)) in perspectiveTransform, file /tmp/opencv-PEaA0A/opencv-2.4.9/modules/core/src/matmul.cpp, line 1936 

無論是numpy的陣列我提供的功能是float64 D型的,所以我推測錯誤來自SCN + 1 == m.cols。下面是我的代碼快照:

initTransform = cv2.getPerspectiveTransform(pointsIn,pointsOut) 
imgCorners = np.array([[0,0],[self.image.size/float(self.image.shape[0]),0]],dtype=np.float64) 
outputCorners = cv2.perspectiveTransform(corners,initTransform) 

感謝您的幫助!

回答

5

嘗試下面的代碼,perspectiveTransform的第一個參數是一個墊目標,其對應於3維數組中numpy的:

import cv2 
import numpy as np 

w, h = 512, 512 
src = np.array(
    [[0, 0], [w - 1, 0], [w - 1, h - 1], [0, h - 1]], dtype=np.float32) 
dst = np.array(
    [[300, 350], [800, 300], [900, 923], [161, 923]], dtype=np.float32) 

m = cv2.getPerspectiveTransform(src, dst) 
result = cv2.perspectiveTransform(src[None, :, :], m) 
+1

由於那絕對是我不清楚從文檔和每個其他時間這問題已經被問到,人們主要關注浮點部分的錯誤。 – user1549912

+2

爲什麼'perspectiveTransform()'的輸入是'src [None,:,:]'不僅僅是'src'?每個元素都必須是2D矩陣而不是矢量? @ user1549912 – nn0p