透视变换(Perspective Transform)

**透视变换(Perspective Transform)**是将图片投影到一个新的视角或平面,变换公式如下。
在这里插入图片描述
在之前的章节中我们学习过仿射变换(affine transform) 可以看到,而射变换的变换矩阵是3x2的变换矩阵。和仿射变换不同的是,透视变换的变换矩阵是一个3x3的矩阵。透视变换的作用域是一个三维坐标系(x,y,z), 而仿射变换则是二维(x,y)平面变换。从另一个角度来说,仿射变换也可以看做是一种特殊的透视变换(z轴方向不变)。

透视变换和仿射变换的一个重要区别是,两条平行的线在经过仿射变换之后依然保持平行,但透视变换并不保证这一点。
在这里插入图片描述
OpenCV提供了透视变换的函数warpPerspective(). 下面我们来尝试使用warpPerspective()函数将下面的卡片透视变换为鸟瞰图(俯视视角)。原图片的分辨率是320x240,我们在图片中找到卡片四个角的坐标,分别为(0,0),(240,21),(0,240),(240,216)。在最终的鸟瞰图中,我们需要这四个点的坐标分别转换为(0,0),(320,0),(0,240),(320,240)。因此利用这四个点的对应关系,我们可以构建变换矩阵。

在这里插入图片描述

    Point2f srcTri[4];
    Point2f dstTri[4];

    Mat warpPerspective_mat( 3, 3, CV_32FC1 );
    Mat src, warpPerspective_dst;

    src = imread( "card2.jpeg", IMREAD_COLOR );

    warpPerspective_dst = Mat::zeros( src.rows, src.cols, src.type() );

    /// 设置4组点,求出变换矩阵
    srcTri[0] = Point2f( 0,0 );
    srcTri[1] = Point2f( 240, 21 );
    srcTri[2] = Point2f( 0,src.rows - 1);
    srcTri[3] = Point2f( 240, 216);

    dstTri[0] = Point2f( 0, 0 );
    dstTri[1] = Point2f( src.cols, 0 );
    dstTri[2] = Point2f( 0, src.rows );
    dstTri[3] = Point2f( src.cols, src.rows );

    //计算透视变换矩阵
    warpPerspective_mat = getPerspectiveTransform( srcTri, dstTri );

    //应用透视变换
    warpPerspective( src, warpPerspective_dst, warpPerspective_mat, src.size() );

    //显示原图和变换后结果
    namedWindow( source_window, WINDOW_AUTOSIZE );
    imshow( source_window, src );

    namedWindow( warpPerspective_window, WINDOW_AUTOSIZE );
    imshow( warpPerspective_window, warpPerspective_dst );
    waitKey(0);

最终得到的结果如下。图片被成功转换到了鸟瞰图的视角。
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
透视变换Perspective Transform)是图像处理中一种常用的技术,用于将图像从一个视角映射到另一个视角,以获取不同的投影效果。在 Python 中,可以使用 OpenCV 库来实现透视变换。 以下是一个使用 OpenCV 和 NumPy 库进行透视变换的示例代码: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg') # 设置源点坐标和目标点坐标 src_points = np.float32([[x1, y1], [x2, y2], [x3, y3], [x4, y4]]) dst_points = np.float32([[x1_new, y1_new], [x2_new, y2_new], [x3_new, y3_new], [x4_new, y4_new]]) # 计算透视变换矩阵 perspective_matrix = cv2.getPerspectiveTransform(src_points, dst_points) # 进行透视变换 result = cv2.warpPerspective(image, perspective_matrix, (width, height)) # 显示原图和结果图 cv2.imshow('Original Image', image) cv2.imshow('Perspective Transform Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在代码中,你需要根据实际情况设置源点和目标点的坐标。源点坐标指的是原始图像中需要进行透视变换的区域的四个角点,目标点坐标则是你希望将这个区域映射到的新的位置。透视变换矩阵可以通过 `cv2.getPerspectiveTransform()` 函数计算得到,然后使用 `cv2.warpPerspective()` 函数将原图进行透视变换,得到结果图像。 需要注意的是,透视变换需要提供源点坐标和目标点坐标,以及结果图像的宽度和高度。确保源点和目标点坐标的顺序是一致的,否则可能会导致不正确的映射结果。 希望这个示例能帮助到你进行透视变换的实现。如果有任何问题,请随时提问。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值