透视变换法校正轮廓(全过程) | python代码

原理

需要透视变换的轮廓信息一般包括以下四类:

在使用cv2.findContours()得到的contours信息是按逆时针存储的。最容易校正的情况是(2)和(4),原因见下(特征最明显,最容易确定,所以你需要把你要校正的图像摆放的跟你的代码写的一致):
在这里插入图片描述

图片预处理

以这张图片为例
在这里插入图片描述
import cv2
import numpy as np
import math
#from matplotlib import pyplot as plt
#图像预处理#####################################################################
img = cv2.imread(“D:\python_opencv\H_3.jpg”)
height=int(img.shape[0])
width=int(img.shape[1])
#print(height,width)
img = cv2.resize(img, (int(width),int(height)), interpolation=cv2.INTER_CUBIC)
imgPP=img.copy()
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#ret, binary = cv2.threshold(grayImage,5,255,cv2.THRESH_BINARY)
gaussImage = cv2.GaussianBlur(grayImage, (3,3), 0)
edgedImage = cv2.Canny(gaussImage,149,149*3) #可调参数
在这里插入图片描述

找到轮廓

#找四边形的轮廓#################################################################
contours,hierarchy = cv2.findContours(edgedImage.copy(),cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours= sorted(contours, key=cv2.contourArea, reverse=True)[:1]
pentagram=contours[0]
print(pentagram)
cv2.drawContours(img,pentagram,-1,(0,0,255),3)
cv2.imshow(“img”,img)
在这里插入图片描述

找到四个关键点

#找四边形的四个关键点###########################################################
P1= np.array(pentagram[:,0][pentagram[:,:,0].argmin()])
P2= np.array(pentagram[:,0][pentagram[:,:,1].argmin()])
P3= np.array(pentagram[:,0][pentagram[:,:,1].argmax()])
P4= np.array(pentagram[:,0][pentagram[:,:,0].argmax()])

cv2.circle(imgPP,tuple(P1), 2, (0,255,0),3)
cv2.circle(imgPP,tuple(P2), 2, (255,0,255),3)
cv2.circle(imgPP,tuple(P3), 2, (0,255,0),3)
cv2.circle(imgPP,tuple(P4), 2, (255,0,255),3)
cv2.imshow(“imgPP”,imgPP)
在这里插入图片描述

透视变换校正

#透视变换#######################################################################
#输入梯形的四个顶点
srcPoints=np.vstack((P1,P2,P3,P4))
srcPoints=np.float32(srcPoints)
print(srcPoints)
#目标的像素值大小
#以下参数解释:96为分辨率,可在图片的属性的详细信息里查询。
#29.7,21分别是A4纸(需校正尺寸物体)的长和宽,单位是cm。2.54为英寸的换算
long=(29.7)*96/2.54
short=(21)*96/2.54
#设置目标画布的大小
canvasPoints=np.array([[0,0],[int(long),0],[0,int(short)],[int(long),int(short)]])
canvasPoints=np.float32(canvasPoints)
print(canvasPoints)
#计算转换矩阵
perspectiveMatrix=cv2.getPerspectiveTransform(srcPoints,canvasPoints)
#完成透视变换
perspectiveImg=cv2.warpPerspective(imgPP,perspectiveMatrix,(int(long)+100,int(short)+100))
cv2.imshow(“perspectiveImg”,perspectiveImg)
在这里插入图片描述

注意事项

  1. 代码中含有注释信息,请仔细查看
  2. 此程序校正的轮廓需要你斜一点,这有助于计算机快速找到这四个点

猜你喜欢

转载自blog.csdn.net/weixin_42326479/article/details/102938733