【Opencv】透视变换python实现效果

  1. 原始图片(即需要变换的图片)

  2. 透视变换代码

# -*- coding:utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 计算透视变换参数矩阵
def cal_perspective_params(img, points):
    # 设置偏移点。如果设置为(0,0),表示透视结果只显示变换的部分(也就是画框的部分)
    offset_x = 100
    offset_y = 100
    img_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)
    return M, M_inverse

# 透视变换
def img_perspect_transform(img, M):
    img_size = (img.shape[1], img.shape[0])
    return cv2.warpPerspective(img, M, img_size)

def draw_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)
    return points,img

if __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)
  1. 选中透视区域(确定四个坐标点)

  2. 透视效果

  3. 透视变换原理
    可参考:https://blog.csdn.net/zchang81/article/details/73409974

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
OpenCV是一个优秀的计算机视觉库,为Python提供了强大的图像处理和计算机视觉功能。透视变换是一种将图像从一种视角投影到另一种视角的一种方法。在计算机视觉透视变换通常被用于图像矫正、图像尺度变化、频谱分析等方面。这篇文章将对OpenCV透视变换Python的详细应用进行介绍。 首先,需要明确OpenCV透视变换的原理。透视变换实际上是一种基于同名点的变换方法,即在两个不同视角下拍摄同一个图像或场景,然后将这两个图像通过相应的变换进行对齐。它的基本原理是:通过计算两个视角之间的变换矩阵,把一个图像在另一个视角的位置上显示出来。 要进行透视变换,需要用到OpenCV的cv2.warpPerspective()函数。该函数有四个输入参数:源图像变换矩阵、输出图像尺寸和插值方法。其变换矩阵是一个 3x3 的矩阵,插值方法可选,默认是线性插值。 在进行透视变换时,需要先进行角点检测,即使用函数cv2.findContours()和cv2.approxPolyDP()函数找到图像几何形状最相似的四个点,并将这些点进行透视变换矩阵的计算。这一过程可以简化为如下几步: 1、读取源图像,初步处理 2、寻找感兴趣区域,也就是四个角点 3、用透视变换矩阵进行变换 4、输出处理后的图像 代码如下所示: import cv2 import numpy as np img = cv2.imread('test.jpg') #读入源图像 height, width = img.shape[:2] #取得源图像的长和宽信息 pts1 = np.float32([[54,70],[373,70],[28,409],[407,409]]) #设置一个包含4个角点的数组 pts2 = np.float32([[0,0],[width,0],[0,height],[width,height]]) #经过透视变换后需要变形到的位置 M = cv2.getPerspectiveTransform(pts1,pts2) #计算透视变换矩阵 dst = cv2.warpPerspective(img,M,(width,height)) #进行透视变换 cv2.imshow('src', img) #原图 cv2.imshow('dst', dst) #透视变换后的图 cv2.waitKey(0) cv2.destroyAllWindows() 通过上述代码片段,我们可以实现对一张图像进行简单的透视变换,类似的方法也可以应用于其他场景,如校正石墨纸或白板上的图形或文字。总的来说,在OpenCV的支持下进行透视变换实现起来非常简单,而且可以应用于多种场景,对于需要对图像进行精确变换计算机视觉应用,是不可或缺的基本操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值