学习笔记4(opencv and python 透视变换(鸟瞰))

@ 鸟瞰图像的实现,用四边顶点坐标来进行来进行透视变换

相关opencv函数

1.cv2.getPerspectiveTransform(src,M)

src表示原图像的四边顶点的坐标,M表示为要求变换的四边顶点的坐标,最后得到一个3x3的变换矩阵

2.cv2.warpPerspective(src,M,dsize(height,width)

src为输入的图像,M为cv2.getperpectiveTransform()函数的到的变换矩阵,
src为输入图像,M为cv2.getperpectiveTransform()函数的到的变换矩阵),dsize为输出图像的大小
如果还是不懂的话,看这个链接!!!

先看一下我的实现结果

在这里插入图片描述

上代码

import numpy as np
import cv2
def order_points(pts):
    #进行初始化点的位置,左上、右上、左下、右下
    rect = np.zeros((4, 2), dtype = "float32")
    #采取四个点的x+y的和,以最小的和为左上的点,x+y最大为右下的点
    s = pts.sum(axis = 1)
    rect[0] = pts[np.argmin(s)]
    rect[2] = pts[np.argmax(s)]
   #定义一左下点和右上点的位置,用|x-y|表示,小的为右上,大的为左下
    diff = np.diff(pts, axis = 1)
    rect[1] = pts[np.argmin(diff)]
    rect[3] = pts[np.argmax(diff)]
    
    return rect

def four_point_transform(image, pts):
    rect = order_points(pts)
    (tl, tr, br, bl) = rect
    #重新计算新的图像的宽度和高度
    widthA = np.sqrt(np.sum((br - bl) ** 2))
    widthB = np.sqrt(np.sum((tr - tl) ** 2))
    maxWidth = max(int(widthA), int(widthB))

    heightA = np.sqrt(np.sum((tr - br) ** 2))
    heightB = np.sqrt(np.sum((tl - bl) ** 2))
    maxHeight = max(int(heightA), int(heightB))
    #重新定义新的图像的四边顶点的坐标
    dst = np.array([
        [0, 0],
        [maxWidth - 1, 0],
        [maxWidth - 1, maxHeight - 1],
        [0, maxHeight - 1]], dtype = "float32")
    # 计算透视矩阵,并且变化应用
    M = cv2.getPerspectiveTransform(rect, dst)
    print(M)
    warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))
    
    return warped
image = cv2.imdecode(np.fromfile(r"E:/学习用的图片素材/receipt1.jpg"),-1)
#这里没有用imread的原因是因为我的图片路径有中文,所以用的这种方法
pts = np.array([(153,119),(376,159),(30,428),(300,492)], dtype = "float32")
#使用坐标完成鸟瞰的图像变化,这里的pts里的坐标,最好就是我们输入图像的四边顶点的坐标

warped = four_point_transform(image, pts)
# show the original and warped images
cv2.imshow("Original", image)
cv2.imshow("Warped", warped)
cv2.waitKey(0)

最后的结果显示

1.先看一下M吧

[[ 1.32412921e+00 5.27080561e-01 -2.65314357e+02]
[-2.49406708e-01 1.39044240e+00 -1.27303419e+02]
[ 4.05004587e-05 8.24014712e-04 1.00000000e+00]]
2.最后结果
在这里插入图片描述

最近在看Adrian Rosebrock的博客,以后的笔记也是看了他的博客所记录的

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
OpenCV是一个强大的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,包括透视变换。在Python中,使用OpenCV进行透视变换通常涉及到`cv2.getPerspectiveTransform()`和`cv2.warpPerspective()`这两个核心函数。 1. **获取透视变换矩阵**: `cv2.getPerspectiveTransform(src, dst)` 函数接收两个输入:源图像中的四个点(定义了源图像的不规则矩形区域),以及目标矩形区域的对应点。这个函数会计算一个透视变换矩阵,用于将源图像映射到目标矩形。 2. **应用透视变换**: `cv2.warpPerspective(img, M, dsize, flags=0, borderMode=BORDER_CONSTANT, borderValue=None)` 用这个函数来实际执行变换,其中 `img` 是源图像,`M` 是从上面获得的透视变换矩阵,`dsize` 是目标图像的大小,`flags` 可选参数影响变换的行为(如插值方法),`borderMode` 和 `borderValue` 控制边界像素的处理方式。 一个简单的例子可能如下所示: ```python import cv2 import numpy as np # 假设src_points和dst_points是四点坐标 src_points = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) dst_points = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) # 计算透视变换矩阵 M = cv2.getPerspectiveTransform(src_points, dst_points) # 读取原图并进行透视变换 img = cv2.imread('input.jpg') warped_img = cv2.warpPerspective(img, M, (300, 300)) # 显示原图和变换后的图像 cv2.imshow('Original', img) cv2.imshow('Warped', warped_img) cv2.waitKey(0) cv2.destroyAllWindows() ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值