透視變換的原理可以參看這篇博客,講得相當好了
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的結果是一樣的
