zoukankan      html  css  js  c++  java
  • python cv2中的透视变换

    透视变换的原理可以参看这篇博客,讲得相当好了

    https://blog.csdn.net/guduruyu/article/details/72518340

    唯一有一点问题是,博客中提到的透视变换公式:

     与cv2中的不完全对应,cv2中的公式实际上是

    其实原理上是一样的,但是这关系到输入数据的格式

    按照原blog的公式,输入的点应该是[u,v,1],而实际上应该是[[u],[v],[1]]。花费一晚上踩的坑,希望对你有用。

    另外,附上透视变换后,原图上的点的对应点的坐标求法:

    #变换前的四个角点坐标
    former = np.float32([[100, 0], [0, 100], [100, 100], [200, 0]])
    #变换之后的四个角点坐标
    pts = np.float32([[0, 0], [0, 100], [100, 100], [100, 0]])
    
    
    #变换矩阵M  
    M = cv2.getPerspectiveTransform(former, pts)
    
    #要变换的原图上的点坐标,注意这里是个二维矩阵!!,按照原博客应该是np.float32([100, 50, 1]),是不正确的
    pt = np.float32([[100], [50], [1]])
    
    #原坐标与变换矩阵运算,相当于将该点升维到三维空间
    po = M @ pt
    #将三维空间的点po的x,y值除以z坐标(拉伸系数,相当于归一化),
    po = (po / po[2][0])
    print(po)
    #po的前两维就是透视变换后的点的x,y值
    
    #当然这一过程可以用cv2中函数实现
    print('函数得到的结果:', end='')
    po1 = cv2.perspectiveTransform(np.array([[[100, 50]]], dtype=np.float32), M)
    print(po1)
    #po和po1的结果是一样的
    

      

  • 相关阅读:
    8月份的To-Do List
    Block作为返回值时的使用
    Block作为参数时的使用
    AFNetwork 作用和用法详解
    UIScrollView监听静止的数种情况
    UIAppearance
    自定义Log实现条件编译
    事件的基本概念
    ubuntu16.04下安装MySQL
    在Ubuntu16.04下搭建samba,实现linux与windows之间的资源共享
  • 原文地址:https://www.cnblogs.com/jiangnanyanyuchen/p/14244281.html
Copyright © 2011-2022 走看看