opencv-25 图像几何变换04- 透视 cv2.warpPerspective()

什么是透视?

透视是一种几何学概念,用于描述在三维空间中观察物体时,由于视角的不同而产生的变形效果。在现实世界中,当我们从不同的角度或位置观察物体时,它们会呈现出不同的形状和大小。这种现象被称为透视效果。

透视效果主要由以下几个因素造成:

远近关系:在视野范围内,离我们更远的物体看起来较小,而离我们更近的物体看起来较大。这是因为我们在观察时,远处的物体在视平面上的投影较小。

平行线收敛:在透视效果下,远离观察者的平行线在视觉上会似乎收敛到一个点,被称为消失点。这使得在远处的物体线条会看起来更加趋向于一点。

视角变化:观察物体的视角改变,物体的形状和大小也会发生变化。例如,当我们倾斜或移动头部时,看到的物体会有不同的形态。

透视效果在绘画、摄影、计算机图形学等领域都起着重要的作用。在绘画中,艺术家通常使用透视来创造真实感和深度感。在摄影中,摄影师可以利用透视来拍摄令人惊叹的远景和近景照片。在计算机图形学中,透视是渲染真实感图像的重要技术之一。

在图像处理中,透视变换是一种将图像投影到一个新的视角或平面的方法,以实现校正透视畸变、改变图像视角等目的。通过透视变换,可以将图像中的内容按照一定的规则进行调整,从而达到所需的效果。

opencv 透视的应用场景

OpenCV中透视变换的应用场景非常广泛,它可以在许多不同的领域和任务中发挥重要作用。以下是一些使用OpenCV透视变换的常见应用场景:

  1. 图像校正与纠正:
    透视变换可以用于校正图像中的透视畸变,例如摄像头拍摄的倾斜建筑物或文档图像。通过找到正确的透视变换矩阵,可以将图像变换为在平面上正常显示的形式。
  2. 图像拼接与全景图像:
    在全景图像拼接中,透视变换用于将多个图像对齐并拼接成一个更大的全景图像。通过透视变换,可以校正相机的视角,以便拼接后的图像具有连贯的视觉效果。
  3. 车道线检测与车道保持:
    在自动驾驶或驾驶辅助系统中,透视变换可用于检测车道线并保持车辆在车道中心行驶。通过将图像转换为鸟瞰视角,车道线在图像中将呈现为直线,便于车道线检测算法的实现。
  4. 物体检测与识别:
    在计算机视觉中,透视变换可以用于改变图像的视角,从而便于对物体进行检测和识别。例如,通过将图像转换为俯视视角,可以更容易地检测和跟踪行人或车辆。
  5. 视频稳定与追踪:
    在视频稳定和目标追踪中,透视变换可用于稳定视频或将目标区域转换到固定视角,以便进行更稳健的跟踪。
  6. 增强现实 (AR) 应用:
    在AR应用中,透视变换可以用于将虚拟对象与真实世界中的物体进行融合,从而实现更真实的增强现实体验。
  7. 文档扫描与识别:
    在文档扫描与识别应用中,透视变换可用于校正文档图像中的透视畸变,从而确保文本和图像的水平和垂直对齐。

这些只是OpenCV透视变换的一些常见应用场景,实际上,透视变换在计算机视觉和图像处理中有着广泛的应用,帮助我们解决各种复杂的视觉任务。

透视变换通过函数 cv2.warpPerspective()实现,该函数的语法是:

dst = cv2.warpPerspective( src, M, dsize[, flags[, borderMode[, borderValue]]] )

式中:
 dst 代表透视处理后的输出图像,该图像和原始图像具有相同的类型。dsize 决定输出图
像的实际大小。
 src 代表要透视的图像。
 M 代表一个 3×3 的变换矩阵。
 dsize 代表输出图像的尺寸大小。
 flags 代表插值方法,默认为 INTER_LINEAR。当该值为 WARP_INVERSE_MAP 时,

意味着 M 是逆变换类型,能实现从目标图像 dst 到原始图像 src 的逆变换。具体可选值
参见表 5-1。
 borderMode 代表边类型, 默认为 BORDER_CONSTANT 。 当 该值为 BORDER_
TRANSPARENT 时,意味着目标图像内的值不做改变,这些值对应原始图像内的异常值。

borderValue 代表边界值,默认是 0。
与仿射变换一样,同样可以使用一个函数来生成函数 cv2.warpPerspective()所使用的转换矩阵。

该函数是 cv2.getPerspectiveTransform(),其语法格式为:

retval = cv2.getPerspectiveTransform( src, dst )

式中:
 src 代表输入图像的四个顶点的坐标。
 dst 代表输出图像的四个顶点的坐标。

需要注意的是, src 参数和 dst 参数是包含四个点的数组,与仿射变换函数 cv2.getAffineTransform() 中的三个点是不同的。实际使用中,我们可以根据需要控制 src 中的四
个点映射到 dst 中的四个点。

实验:完成图像透视

import cv2
import numpy as np
img=cv2.imread('demo.bmp')
rows,cols=img.shape[:2]
print(rows,cols)
pts1 = np.float32([[150,50],[400,50],[60,450],[310,450]])
pts2 = np.float32([[50,50],[rows-50,50],[50,cols-50],[rows-50,cols-50]])
M=cv2.getPerspectiveTransform(pts1,pts2)
dst=cv2.warpPerspective(img,M,(cols,rows))
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey()
cv2.destroyAllWindows()

指定原始图像中平行四边形的四个顶点 pts1,指定目标图像中矩形的四个顶点
pts2,使用 M=cv2.getPerspectiveTransform(pts1,pts2)生成转换矩阵 M。接下来,使用语句
dst=cv2.warpPerspective(img,M,(cols,rows))完成从平行四边形到矩形的转换。

运行效果:

opencv-25 图像几何变换04- 透视 cv2.warpPerspective()_第1张图片

实验原图:

opencv-25 图像几何变换04- 透视 cv2.warpPerspective()_第2张图片

你可能感兴趣的:(opencv,opencv,人工智能,计算机视觉)