透視變換的原理可以參看這篇博客,講得相當好了
https://blog.csdn.net/guduruyu/article/details/72518340
唯一有一點問題是,博客中提到的透視變換公式:
與cv2中的不完全對應,cv2中的公式實際上是
其實原理上是一樣的,但是這關系到輸入數據的格式
按照原blog的公式,輸入的點應該是[u,v,1],而實際上應該是[[u],[v],[1]]。花費一晚上踩的坑,希望對你有用。
另外,附上透視變換后,原圖上的點的對應點的坐標求法:
#變換前的四個角點坐標 former = np.float32([[100, 0], [0, 100], [100, 100], [200, 0]]) #變換之后的四個角點坐標 pts = np.float32([[0, 0], [0, 100], [100, 100], [100, 0]]) #變換矩陣M M = cv2.getPerspectiveTransform(former, pts) #要變換的原圖上的點坐標,注意這里是個二維矩陣!!,按照原博客應該是np.float32([100, 50, 1]),是不正確的 pt = np.float32([[100], [50], [1]]) #原坐標與變換矩陣運算,相當於將該點升維到三維空間 po = M @ pt #將三維空間的點po的x,y值除以z坐標(拉伸系數,相當於歸一化), po = (po / po[2][0]) print(po) #po的前兩維就是透視變換后的點的x,y值 #當然這一過程可以用cv2中函數實現 print('函數得到的結果:', end='') po1 = cv2.perspectiveTransform(np.array([[[100, 50]]], dtype=np.float32), M) print(po1) #po和po1的結果是一樣的