2017-06-05 131 views
1

我想在cv2.warpAffine的圖像上使用某些單獨(x,y)點上的相同仿射矩陣M.看來cv2.transform是要走的路。當我嘗試發送點的NX2矩陣我得到negged(使cv.transform工作的麻煩

src = np.array([ 
     [x1,y1],[x2,y2],[x3,y3],[x4,y4]], dtype = "float32") 
    print('source shape '+str(src.shape)) 
    dst=cv2.transform(src,M) 

cv2.error: /home/jeremy/sw/opencv-3.1.0/modules/core/src/matmul.cpp:1947: error: (-215) scn == m.cols || scn + 1 == m.cols in function transform 

我能得到我想要只使用numpy的算術變換:

dst = np.dot(src,M[:,0:2]) +M[:,2] 
    print('dest:{}'.format(dst)) 

但想明白怎麼回事的文檔。說cv2.transform希望M的頻道數等於M的列數,但我不清楚頻道會是什麼 - 也許是'x'頻道和'y'頻道,但第三個頻道會是,而且不同的行代表什麼意思?

+1

很多時候,當OpenCV期望點他們喜歡他們的形式'np.array([[[x1,y1]],[[x2,y2]],...])''。他們通常希望進行點轉換---單個列或行向量,其長度等於座標數量的點數和通道數。第三個座標可以是第三維座標 - 變換矩陣畢竟不僅僅適用於2D變換。 –

+0

謝謝你做的伎倆,我有維度順序思想倒退,c * h * w而不是h * w * c,太多caffe –

+0

偉大的,我已經添加它作爲一個答案。請選擇它作爲你的問題的答案,如果你已經全部解決了。 –

回答

1

Python上的OpenCV經常會形式TS點

np.array([ [[x1, y1]], ..., [[xn, yn]] ]) 

這是不是在documentation for cv2.transform()清楚,但對於使用點等功能的文檔中更加清晰,像cv2.perspectiveTransform()他們提座標是在不同的渠道:

SRC - 輸入雙通道或三通道浮點陣列

變換也可以在3D使用(使用4x4透視變換矩陣),以便解釋在cv2.transform()中使用兩個三通道陣列的能力。