Opencv中的仿射变换和透射变换(获取鸟瞰图)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_40279184/article/details/102756403

1.相似变换(Similarity Transform)相似变换, 旋转+平移+尺度变换;
在这里插入图片描述
其中α控制旋转角 ,tx、ty控制平移量,s控制尺度变换因子
opencv中先获取旋转矩阵,再对原图进行变换可得到相似变换。

#similarity transform
import cv2
img = cv2.imread('***.jpg')
M = cv2.getRotationMatrix2D((img.shape[1] / 2, img.shape[0] / 2), 30, 1) # newcenter, angle, scale 变换矩阵M
img_rotate = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
cv2.imshow('rotated ***', img_rotate)
key = cv2.waitKey(0)
if key == 27:
    cv2.destroyAllWindows()
print(M)

2.仿射变换(Affine Transform)是透射变换的一个特例。其仿射变换是线性的,其需要的是2*3的矩阵和三个控点。变换后其直线的平行关系还回保持,旋转变化直角以及直线平行关系会保持。

# Affine Transform
import cv2
import numpy as np
rows, cols, ch = img.shape
pts1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]])
pts2 = np.float32([[cols * 0.2, rows * 0.1], [cols * 0.9, rows * 0.2], [cols * 0.1, rows * 0.9]])
M = cv2.getAffineTransform(pts1, pts2)
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('affine lenna', dst)
key = cv2.waitKey(0)
if key == 27:
    cv2.destroyAllWindows()

3.透视变换(Perspective Transform)是非线性的,其需要的是3*3的矩阵和四个控点,具体的可以opencv2书里的,后面附带透射变换和仿射变换的程序(直线平行关系不再保持)。
鸟瞰图是一个透视变换的一个重要应用 :
鸟瞰图的本质就是将图像平面中的信息“重投影”到地平面上,所以,首席要获取两个平面间的投影变换关系H。在程序中,是通过在地平面上放置标定板图像,然后获得地平面上棋盘格图像上四个顶点的坐标(0,0),(widht-1,0),(0,height -1),(wdith-1,height-1),这里一般假定棋盘格单位宽度为1,你可以输入已知的棋盘格宽度信息;同时,在图像平面提取角点,并获得与地平面上四个点对应的角点在图像空间中的坐标值,通过四个坐标点间的对应关系,基于getPerspectiveTransform()函数,获得地平面到图像平面间的投影变换关系H;最后,通过warpPerspective()函数对图像进行逆向映射到地平面空间中。
代码如下:

# perspective transform
import cv2
import numpy as np
def get_M_Minv():
    src = np.float32([[(203, 720), (585, 460), (695, 460), (1127, 720)]])
    dst = np.float32([[(320, 720), (320, 0), (960, 0), (960, 720)]])
    M = cv2.getPerspectiveTransform(src, dst)#M矩阵可以用逆变
    Minv = cv2.getPerspectiveTransform(dst,src)
    return M,Minv

猜你喜欢

转载自blog.csdn.net/weixin_40279184/article/details/102756403