由于照相機硬件設備本身的誤差,可能會導致鏡頭畸變,從而導致照相機拍攝到的照片產生失真現象,此時可以通過透視變換去適當的校正。
大概的思路:在原圖像上確定四個點,然后再新圖像上也確定四個點,通過warpMatrix方法,確定出對應的函數關系,從而將圖像進行校正。
import cv2
import numpy as npimg = cv2.imread('beyond.png')
result3 = img.copy()#src和dst的輸入并不是圖像,而是圖像對應的頂點坐標
src = np.float32([[664,423],[1197,1144],[245,785],[709,1307]])#這個是你要截取物體的四個頂點坐標,這四個頂點需要知道
dst = np.float32([[0,0],[883,0],[0,560],[883,560]])#其實就是要校正物體的四個頂點坐標,也就是知道日歷的長和高即可
print(img.shape)#看一下原圖片的大小
#結果為:(1706, 1279, 3)#生成透視變換矩陣,進行透視變換
m = cv2.getPerspectiveTransform(src,dst)#得到映射關系函數
print("warpMatrix:")
print(m)
#結果為:
'''
warpMatrix:
[[ 5.53592476e-01 6.40760353e-01 -6.38627034e+02][-6.16322870e-01 4.55617322e-01 2.16512258e+02][ 2.54107793e-04 -3.90561502e-04 1.00000000e+00]]
'''result = cv2.warpPerspective(result3,m,(883,560))
cv2.imshow("src",img)
cv2.imshow("result",result)
cv2.waitKey(0)
原圖:
日歷的坐標我是用ps里面的標尺看的,不一定特別精準。
日歷四個頂點的位置在圖像上的像素坐標為(行x軸,列y軸):[664,423],[1197,1144],[245,785],[709,1307]
日歷的長為883像素,高為560像素
運行后結果為:
(原圖片太大放不下,截取了一部分)