opencv透视变换(OpenCV透视变换错误)

本篇文章给大家谈谈opencv透视变换,以及OpenCV透视变换错误对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

图像处理之_仿射变换与透视变换

旋转 (线性变换),平移(向量加).缩放(线性变换),错切,反转

仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“睁冲平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式.

以上公式将点(x,y)映射到(x’,y’),在OpenCV中通过指定一个2x3矩阵实现此功能(公式中的m矩阵,是线性变换和平移的组合,m11,m12,m21,m22为线性变化参数,m13,m23为平移参数,其最后一行固定为0,0,1,因此,将3x3矩阵简化为2x3)

a) 以原点为中心旋转,2x3矩阵为:

[ cos(theta), -sin(theta), 0 ],

[ sin(theta), cos(theta), 0 ]

x’ = x * cos(theta) - sin(theta) * y

y’ = x * sin(theta) + cos(theta) * y

b) 平移,2x3矩阵为

[1,0,tx],

[0,1,ty]

x’ = x * 1 + y * 0 + tx = x + tx

y’ = x * 0 + y * 1 + ty = y + ty

在OpenCV中,仿射变换通过函数cvWrapAffine(src,dst,mat)实现,其中mat是2x3的仿射矩阵,该矩阵可以利用函数cvGetAffineTransform(srcTri,dstTri,mat)得到,其中mat是被该函数填充的仿射矩阵,srcTri和dstTri分别是由三个顶点定义的平行四边形(由于是平行四边形,只需要指定三个顶点即可确定),即:给出变换前的ABCD和变换后的A’B’C’D’

将2D矩阵图像变换成3D的空间显示效果,全景拼接.

透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x’,y’)空间的映射.相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同(m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于悉仿歼实现透视变换.

以上公式设变换之前的点是z值为1的点,它三维平面上的值是x,y,1,在二维平面上的投大坦影是x,y,通过矩阵变换成三维中的点X,Y,Z,再通过除以三维中Z轴的值,转换成二维中的点x’,y’.从以上公式可知,仿射变换是透视变换的一种特殊情况.它把二维转到三维,变换后,再转映射回之前的二维空间(而不是另一个二维空间).

在OpenCV中,透视变换通过函数cvWrapPerspective(src,dst,mat)实现, 与仿射变换不同的是,透视矩阵是一个3x3的矩阵,在计算矩阵时,可利用函数cvGetPerspectiveTransform(srcQuad,dstQuad,mat),由于不再是平行四边形,需要提供四边形的四个顶点

仿射变换后平行四边形的各边仍操持平行,透视变换结果允许是梯形等四边形,所以仿射变换是透视变换的子集

[img]

OpenCV实现图像的几何变换

几何变换主要包括缩放、平移、旋转、仿射变换、透视变换和图像裁剪等。执行这些几何变换的两个关键函数是cv2.warpAffine()和cv2.warpPerspective()。

cv2.warpAffine()函数使用以下2 x 3变换矩阵来变换源图像:

cv2.warpPerspective()函数使用以下3 x 3变换矩阵变换源图像:

接下来,我们将了解最常见的几何变换技术。

缩放图像时,可以直接使用缩放后图像尺寸调用cv2.resize():

除悉掘了上述用法外,也可以同时提供缩放因子fx和fy值。例如,如果要将图像缩小 2 倍:

如果要放大图像,最好的方法是使用cv2.INTER_CUBIC插值方法(较耗时)或cv2.INTER_LINEAR。如果要缩小图像,一般的方法是使用cv2.INTER_LINEAR。OpenCV提供的五种插值方法如下表所示:

显示缩放后的图像:

可以通过坐标系观察图片的缩放情况:

为了平移对象,需要使用NumPy数组创建2 x 3变换矩阵,其中提供了x和y方向的平移距离(以像素为单位):

其对应于以下变换矩阵:

创建此矩阵后,调用cv2.warpAffine()函数:

cv2.warpAffine()函数使用提供的 M 矩阵转换源图像。第三个参数 (width, height) 用于确定输出图像的大小。

例如,如果图片要在 x 方向平移 200 个像素,在 y 方向移动 30 像素:

平移也可以为负值,此时为反方向移动:

显示图片如下:

为了旋转图像,需要首先使用cv.getRotationMatrix2D()函数来构建2 x 3变换矩阵。该矩阵以所需的角度(以度为单位)旋转图像,其中正值表示逆时针旋转。旋转中心 (center) 和比例因子 (scale) 也可以调整,使用这些元素,以下方式计算变换矩阵:

其中:

以下示例构建 M 变换矩阵以相对于图像中心旋转 180 度,缩放因子为 1(不缩放)。之后,将这个 M 矩阵应用于图像,如下所示:

接下来使用不同的旋转中心进行旋转:

显示旋转后的图像:

在仿射变换中,首先需要使用cv2.getAffineTransform()函数来构建2 x 3变换矩阵,该矩阵将从输入图像和变换图像中的相应坐标中获得。最后,将 M 矩阵传递给cv2.warpAffine():

仿射变换是保留点、直线和平面的变换。此外,平行线在此变换后将保持平行。但是,仿射变换不会同时保留像素点之扮陆燃间的距离和角度。

可以通过以下图像观察仿射变换的结果:

为了进行透视变换,首先需要使用cv2.getPerspectiveTransform()函数创建3 x 3变换矩阵。该函数需要四对点(源图像和输出图像中四边形的坐标),函数会根据这些点计算透视变换矩阵。厅虚然后,将 M 矩阵传递给cv2.warpPerspective():

透视变换效果如下所示:

可以使用NumPy切片裁剪图像:

裁剪结果如下所示:

链接:

透视变换(perspective transform)

透视变换(Perspective Transform)是将图片投影到一个新的视角或平面,变换公式如下。

OpenCV提供了纯册透视变换的函数 warpPerspective() . 下面我们来尝试使用warpPerspective()函数将下面的卡饥培片透视变换为鸟瞰图(俯视视角)。原图片的分辨率是320x240,我们在图片中烂裤唯找到卡片四个角的坐标,分别为(0,0),(240,21),(0,240),(240,216)。在最终的鸟瞰图中,我们需要这四个点的坐标分别转换为(0,0),(320,0),(0,240),(320,240)。因此利用这四个点的对应关系,我们可以构建变换矩阵。

最终得到的结果如下。图片被成功转换到了鸟瞰图的视角。

关于opencv透视变换和OpenCV透视变换错误的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表