- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对投影变换矩阵中元素的含义有疑问,例如在 OpenCv
使用的单应性中 warpPerspective
.
我知道仿射变换的基础知识,但在这里我对射影变换更感兴趣,这意味着在下面显示的矩阵中元素 A31
和 A32
:
A11 A12 A13
A21 A22 A23
A31 A32 1
我对这些值进行了一些调整,这意味着所有其他元素都有一个固定的数字。含义:
1 0 0
0 1 0
A31 A32 1
只有投影元素。
但是究竟是什么导致了元素 A31 和 A32 呢?比如A13和A23负责水平和垂直平移。
这两个元素有简单的解释吗?就像具有正值意味着......,具有负值意味着......。 S.th.像那样。
希望有人能帮助我。
最佳答案
牛顿的描述是正确的,但实际查看转换以了解正在发生的事情以及它们如何与转换矩阵中的其他值一起工作以使其更有意义可能会有所帮助。我将提供一些带有动画的 python/OpenCV 示例,以显示这些值的作用。
import numpy as np
import cv2
img = cv2.imread('img1.png')
h, w = img.shape[:2]
# initializations
max_m20 = 2e-3
nsteps = 50
M = np.eye(3)
所以在这里我将变换矩阵设置为恒等式(无变换)。我们希望看到改变变换矩阵 M
中 (2, 0) 处的元素的效果,因此我们将通过在 之间线性间隔的
到 nsteps
循环来制作动画>0max_m20
。
for m20 in np.linspace(0, max_m20, nsteps):
M[2, 0] = m20
warped = cv2.warpPerspective(img, M, (w, h))
cv2.imshow('warped', warped)
k = cv2.waitKey(1)
if k == ord('q') & 0xFF:
break
我将此应用到从 Oxford's Visual Geometry Group 拍摄的图像上.
确实,我们可以看到这类似于围绕与图像左边缘对齐的点旋转相机,或者围绕轴旋转图像本身。但是, 与此略有不同。请注意,顶部边缘始终保持在顶部,这有点奇怪。我们不是像上面那样绕轴旋转,而是想象顶部边缘也会开始下降到右侧边缘。像这样:
好吧,如果您正在考虑转换,获得此转换的一种简单方法是采用上面的转换,并添加一些倾斜失真,以便在插入右下角时将右上角向下推向上。这实际上正是这个 View 的创建方式:
M = np.eye(3)
max_m20 = 2e-3
max_m10 = 0.6
for m20, m10 in zip(np.linspace(0, max_m20, nsteps), np.linspace(0, max_m10, nsteps)):
M[2, 0] = m20
M[1, 0] = m10
warped = cv2.warpPerspective(img, M, (w, h))
cv2.imshow('warped', warped)
k = cv2.waitKey(1)
if k == ord('q') & 0xFF:
break
因此,在我看来,考虑这些矩阵中的透视图的正确方法是将倾斜条目和最后一行放在一起。这是单应矩阵中角度实际被修改的两个地方*;否则,它只是旋转、缩放和平移——所有这些都是角度保持。
*Note: Actually, angles can be changed in one more way that I didn't mention. Affine transformations allow for non-uniform scaling, which means you can stretch a shape in width and not in height or vice-versa, which would also change the angles. Imagine if you had a triangle and stretched it only in width; the angles would change. So it turns out that non-uniform scaling (i.e. when the first and middle element of the transformation matrix are different values) can also modify angles in addition to the perspective change and shearing distortions.
请注意,在这些示例中,这同样适用于具有另一个倾斜位置的最后一行中的第二个条目;唯一的区别是它发生在顶部而不是左侧。在这两种情况下,负值类似于沿该轴旋转平面朝向而不是远离相机。
关于OpenCv warpPerspective单应性元素的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45761682/
好吧,我不得不承认我是 OpenCV 的新手,而且我的 MATLAB/lin.代数知识可能会引入偏差。但是我想做的事情很简单,但我仍然没有找到答案。 当尝试在透视变换下校正图像(或图像的一部分)时,您
我需要处理一些从扫描仪获得的信息。问题是我偶尔会旋转图像。我决定在照片上添加一些特殊对象,以便能够使用技术 Features2D + Homography 来找到该对象。我认为在找到特殊对象后我可以将
我正在使用 opencv warpPerspective() 函数扭曲图像中找到的轮廓以找到我正在使用 findContours() 的轮廓。 如图所示: 但是 warpPerspective() 函
我有一张图片和一张属于那张图片的深度图,我需要每个像素的深度(我使用的是kinect)。我想用这张图片创建一个全景 View 及其深度,所以我使用了一些 opencv 方法。尤其是这一行是目前导致问题
我正在尝试使用 OpenCV 3,特别是 SIFT 功能、findHomography 和 warpPerspective,以便在更大的 image2 中找到 image1,然后对 image2 进行
我正在用 Java 构建一个使用 OpenCV 的应用程序。我以前没有使用过这个库,而且 Java 实现有点缺乏文档。我需要撤消透视扭曲图像以使其平方。我需要将梯形转换为矩形。基本上我需要拉伸(str
我找到了一个改变视角的程序,比如 我的问题是如何回到源图像,并获得第二幅图像中绘制的红点的坐标?这是代码: #include #include int main(int argc, char**
我的应用程序需要将一个四边形映射到另一个四边形。这些都不是矩形。 但是,我从 warpPerspective() 得到的结果始终是一个矩形。我曾尝试将“离群值”标志设置为不同的值,以防止来自扭曲四边形
我目前正在尝试在 Eclipse 中实现基本图像拼接 C++ (OpenCV) 代码。特征检测部分显示了 SURF 特征的出色结果。但是,当我尝试将 2 个图像一起扭曲时,我只能得到一半的图像作为输出
我使用 getHomography 和 warpPerspective 将图像从正面视角更改为出价视角。 它的工作原理是图像扭曲到所需的视角,但裁剪已关闭。它将扭曲的图像大部分移动到图像框之外。我假设
我使用以下方法成功找到了 2 个图像之间的单应矩阵: Mat H = findHomography(mpts_2, mpts_1, RANSAC, 1, outlier_mask); 现在,对于给定的
是否有一个 iOS 功能与 openCV 的 warpPerspective 功能相同?如果是,参数是否相同? 最佳答案 This answer使用 CATransform3D CoreAnimati
我最近开始探索 OpenCV,但我很难理解 warpPerspective,文档帮助不大。我的意思是为什么要使用它?如果我需要调整图像大小,我可以使用 resize 方法,那么使用 warpPersp
我正在尝试从头开始实现 openCV 方法 warpPerspective(),我编写了下面的代码,它可以处理 y 和 x 的偏移,但是,当我将单应矩阵从 findHomography() 传递给函数
我正在尝试纠正图像。我有点对应,我计算了两个矩阵 F1 和 F2。之后,我要整顿。以下是我的代码 cv::Mat F1(4,4, CV_64FC1); cv::Mat F2(4,4
我为自己做了一个小例子来尝试使用 OpenCVs wrapPerspective,但输出并不完全符合我的预期。 我的输入是一个 45° 角的条。我想对其进行转换,使其垂直对齐/呈 90° 角。没问题。
我在图像上运行 cv::warpPerspective() 函数,以及如何获取我在源图像中获得的结果图像的某些点的位置,这是我来了多远: int main (){ cv::Point2f s
我对 getPerspectiveTransform 的参数有点困惑,因为我看不到正确的图像。这是我的代码。 original_image 变量是包含我要裁剪并创建新图像(类似 Android Ope
我正在使用 OpenCV 3.1 和 Python。 当我尝试对带有文本的图像进行校正(修复倾斜度)时,我的问题就来了。我正在使用 cv2.warpPerspective 使其成为可能,但图像质量下降
我使用了四组点来获得透视变换矩阵。然后使用 warpPerspective 将矩阵 A 转换为矩阵 B。从 Mat A 点 a。我想在 mat B 中获取新点 a 的位置。但是 warpPerspec
我是一名优秀的程序员,十分优秀!