透视变换是将成像投影到一个新的平面上,也称作投影映射。OpenCV通过函数cv2.getPerspectiveTransorm(pos1,pos2)构造矩阵M,其中pos1和pos2分别表示变换前后4个点的对应位置。得到M后再通过函数cv2.warpPerspective(src,M,(cols,rows))进行透视变换。
函数中的pos1表示:透视变换前4个点的对应位置。
函数中的pos2表示:透视变换后4个点对应位置。
cv2.warpPerspective(src,M,(cols,rows))
src:输入图像
M:透视变换矩阵
实现步骤
这里我用透视变换实现文档矫正功能,操作步骤如下:
1.获取输入图像
获取输入图像,输入图像如下,我们需要对该图进行矫正。
2.获得顶点坐标
利用鼠标点击获取纸张的4个点,这里用到cv2.setMouseCallback()函数,获取点位函数如下:
def get_point(self, event, x, y, flags, image):if event == cv2.EVENT_LBUTTONDOWN: # 检测左键点击事件if len(self.points) < 4:self.points.append((x, y)) # 存储点击的坐标print(f'{x},{y}')cv2.circle(image, (x, y), 5, (0, 255, 0), -1)if len(self.points) == 4:cv2.line(image, self.points[0], self.points[1], (0, 255, 0), 2) # 逆时针画cv2.line(image, self.points[1], self.points[2], (0, 255, 0), 2)cv2.line(image, self.points[2], self.points[3], (0, 255, 0), 2)cv2.line(image, self.points[3], self.points[0], (0, 255, 0), 2)
效果如下图:
获得四个顶点坐标后,会把目标的轮廓绘制出来
3.文档矫正
下图为矫正后的效果图