python cv2中的透視變換


透視變換的原理可以參看這篇博客,講得相當好了

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的結果是一樣的

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM