由于照相机硬件设备本身的误差,可能会导致镜头畸变,从而导致照相机拍摄到的照片产生失真现象,此时可以通过透视变换去适当的校正。
大概的思路:在原图像上确定四个点,然后再新图像上也确定四个点,通过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像素
运行后结果为:
(原图片太大放不下,截取了一部分)