原始图片(即需要变换的图片)
透视变换代码
# -*- coding:utf-8 -*-importcv2importnumpyasnpimportmatplotlib.pyplotasplt# 计算透视变换参数矩阵defcal_perspective_params(img,points):# 设置偏移点。如果设置为(0,0),表示透视结果只显示变换的部分(也就是画框的部分)offset_x=100offset_y=100img_size=(img.shape[1],img.shape[0])src=np.float32(points)# 透视变换的四个点dst=np.float32([[offset_x,offset_y],[img_size[0]-offset_x,offset_y],[offset_x,img_size[1]-offset_y],[img_size[0]-offset_x,img_size[1]-offset_y]])# 透视矩阵M=cv2.getPerspectiveTransform(src,dst)print(M)# 透视逆矩阵M_inverse=cv2.getPerspectiveTransform(dst,src)print(M_inverse)returnM,M_inverse# 透视变换defimg_perspect_transform(img,M):img_size=(img.shape[1],img.shape[0])returncv2.warpPerspective(img,M,img_size)defdraw_line(img,p1,p2,p3,p4):points=[list(p1),list(p2),list(p3),list(p4)]# 画线img=cv2.line(img,p1,p2,(0,0,255),3)img=cv2.line(img,p2,p4,(0,0,255),3)img=cv2.line(img,p4,p3,(0,0,255),3)img=cv2.line(img,p3,p1,(0,0,255),3)returnpoints,imgif__name__=='__main__':# 观察图像像素大小,便于手动选点img=cv2.imread('book.jpg')plt.figure()plt.imshow(img)plt.show()# 选取四个点,分别是左上、右上、左下、右下points,img=draw_line(img,(208,320),(798,315),(160,1308),(1011,1230))cv2.imshow('test01',img)cv2.waitKey(0)cv2.imwrite('test01.png',img)M,M_inverse=cal_perspective_params(img,points)trasform_img=img_perspect_transform(img,M)# 观察透视图像像素大小plt.figure()plt.imshow(trasform_img)plt.show()cv2.imshow('test02.png',trasform_img)cv2.waitKey(0)cv2.imwrite('test02.png',trasform_img)选中透视区域(确定四个坐标点)
透视效果
透视变换原理
可参考:https://blog.csdn.net/zchang81/article/details/73409974