问题标签 [projective-geometry]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
28 浏览

computer-vision - 如何使用对极约束推断 l' = Ex 或 l' = Fx?

如何 使用极线约束推导出l' = Ex ?

其中l'是核线,E是基本矩阵,x是图像平面中的投影点。

我知道根据极线约束(所有 3 个向量都位于同一平面上)我们可以写:

x .[ T x] R x ' = 0

E = [ T x] R

xE x ' = 0

但我还没有在文献中找到如何证明 Ex' 等于核线方程以便推导出以下内容:

l ' = E x

先感谢您。

0 投票
1 回答
141 浏览

graphics - 通过拖动手柄进行投影变换

我们想实现这种转换:Screenshot-73.png

截图 73

此图像取自 Gimp,使用统一变换工具。您只需拖动角,矩形就可以自由变换。我相信这被称为射影变换

给定角的位置,有没有人有公式来为这种投影变换创建变换矩阵?

0 投票
1 回答
260 浏览

optimization - 为什么最小化重投影误差而不是束调整的三角误差?

对于束调整优化,为什么要最小化重投影误差而不是训练误差或 ray-to-3d 点误差?重投影误差的缺点是:对于透视相机,它高度依赖于相机从 3d 右侧点开始的深度。

0 投票
1 回答
900 浏览

python - 如何从已知参数构造相机矩阵

我希望在 2D 平面上投影使用我知道所有参数(焦距、传感器尺寸、X、Y、Z、旋转(omega、phi、kappa)的相机拍摄的图像。我知道我需要构建一个在能够进行平面单应性之前的相机矩阵,但是如何?

在这个答案之后,我已经成功地在每个平面上使用 4 个已知点对生成了一个矩阵,但这不是我想要的方式。我看过这个视频,它给了我几乎所有的答案,但是没有详细描述名为“外部参数”的矩阵。旋转矩阵R和相机位置的矩阵T应该如何构造?

有了最终的相机矩阵,假设我将能够获取每个参数并将它们提供给PIL.Image.transform. 我也愿意使用 python OpenCV 库。

以下是一些示例数据:

此处为原始图像(4288 x 2848 像素)

0 投票
1 回答
169 浏览

opencv - 将坐标系投影到图像中的倾斜平面上

我想定义一个投影到图像内某个平面上的坐标系。我只需要一些关于如何实现这一点的提示和想法,不一定是代码,但一切都值得赞赏!如果提供了代码,在以 Python 为语言的 OpenCV 中将是首选。

示例:我有一张从某些角度看的桌子图像。我使用放置在桌面上的棋盘图案拍摄了 N 张校准图像。我们可以想象它是一个平面的斯诺克台球桌。我已经计算了内在/外在校准矩阵、单应矩阵,我可以将图像投影到我的桌面上——一切都很好。但是现在我想在桌面上创建一个坐标系。如果我知道桌面的尺寸是 1 米乘 2 米,我想要一个函数,我可以说:给我图像中对应于点的 2d 像素坐标(x=0.75 米,y=1.65 米) 在桌面表面上。我希望原点从桌面的左上角开始,但这应该只是一个翻译问题。我怎样才能使这个坐标系和相应的功能来“使用”它?

我提出了两种可能的方法,但似乎都非常无效,我相信必须存在一种更有效和更强大的方法。

1:在我的校准过程中,我在桌面上放置了 N 个不同的校准图案图像。这给了我 N 个局部坐标系,一个用于每个校准模式。由于每个校准图案都留在桌面上,因此 x 轴和 y 轴将始终位于同一平面上。使用这个OpenCV指南我可以绘制沿着桌面平面的轴,每个点都匹配为棋盘格的大小,所以我有一个工作公制转换米到像素。最大的问题是,如果棋盘边缘不平行于桌子边缘,那么我的坐标系就会错位。另一个问题是,通过有 N 个小坐标系,我必须选择一个任意一个,然后手动找到它到左上桌面位置的对应平移,并围绕 origo 旋转以重新对齐轴。这使得解决方案非常手动,并且难以动态化。最终,最好在像素值中定义 4 个手动识别的表格边缘,然后需要任何派生值,例如单应矩阵、旋转矩阵、平移矩阵等。

2:我可以生成坐标网格的图像,然后将此图像网格投影到我的桌面图像上。该技术将与类似。然后我会扩充我的原始桌面图像以包含一个已正确转换的网格(即靠近相机的网格坐标方块大于更远的网格坐标方块)。然而,这并不能让我从绘制的网格中提取坐标。如果我可以投影一个网格而不是图像,那将是一个非常简单的解决方案。据我在 OpenCV 文档中看到的,这是不可能的。

0 投票
1 回答
2219 浏览

computer-vision - 基于内在和外在相机参数计算单应矩阵

我愿意为6个鱼眼相机进行360°全景拼接。

为了找到相机之间的关系,我需要计算单应矩阵。后者通常是通过在图像中找到特征并匹配它们来计算的。

但是,对于我的相机设置,我已经知道

  • 我通过相机校准计算的内在相机矩阵 K 。
  • 外部相机参数 R 和 t。相机方向是固定的,在任何时候都不会改变。摄像机位于已知直径 d 的圆上,每个摄像机相对于圆偏移 60°。

因此,我认为我可以手动计算 Homography Matrix,我假设这会产生比执行特征匹配更准确的方法。

在文献中,我发现了以下公式来计算将图像 2 与图像 1 相关联的单应矩阵:

这个公式只考虑了相机之间的旋转角度,而不是我的例子中存在的平移向量。

如何将每个相机的平移 t 插入 H 的计算中?

我已经尝试在不考虑平移的情况下计算 H,但是由于 d>1 米,图像在全景图片中没有准确对齐。

编辑:

根据下面弗朗切斯科的回答,我得到了以下问题:

  • 校准鱼眼镜头后,我得到了一个K焦距f=620为 1024 x 768 的图像的矩阵。这被认为是大焦距还是小焦距

  • 我的相机位于直径为 1 米的圆圈上。下面的解释让我很清楚,由于相机之间的这种“大”平移,我对相对靠近它们的物体产生了显着的重影效果。因此,如果 Homography 模型不能完全代表相机的位置,是否可以使用其他模型,例如 Fundamental/Essential Matrix 进行图像拼接?

0 投票
0 回答
129 浏览

opengl - 为什么在简单投影之上在 OpenGL 中使用截锥体?

为简单起见,让我们考虑一个 3D 场景,在应用模型和视图矩阵之后,所有顶点都在立方体 [-1,-1,-1]...[1,1,1] 内。

根据下图所示的几何设置,可以得出空间中一点 (X,Y,Z) 到平面 z=D 上的投影坐标 (X s , Y s ) 的公式:

在此处输入图像描述

从 X s / D = X / Z,得出

X s = X / (Z/D),类似地 Y s = Y / (Z/D)。

从这里我们可以构造一个齐次坐标 (x, y, z, w) = (X, Y, Z, Z/D),当转换回欧几里得空间时,将给出 (X s , Y s , D)。

这种情况下的投影矩阵 P 很简单:

和 P * (X, Y, Z, 1) = (x, y, z, w)

为了让 z-test 在片段着色器中工作,可以通过指定以下内容来恢复 z 信息:

上面的代码和矩阵 P 似乎足以让所有投影几何工作。

也可以使用缩放矩阵和 P 来说明视口纵横比,并在必要时将原始场景缩放到 [-1,-1,-1]...[1,1,1] 空间。

那么为什么要使用截锥体呢?

截锥体到剪辑空间的变形非常复杂,不需要创建透视图。

只是为了模拟具有视锥的物理相机还是有其他原因?

0 投票
0 回答
35 浏览

math - 给定一条闭凸曲线,让一条中心凸曲线外接它,那么 B/A 的最小值是多少?(A 和 B 是它们对应的面积)

我猜答案是 2,但我无法证明。

我的意思是所有 A 中最小 B/A 的超模。

注意:

中心凸曲线是指凸曲线关于其中的一点对称,也就是说,当您将曲线绕该点旋转 180 度时,它又回到原来的曲线。

对于被认为是最不对称的三角形,2 是下限。这就是为什么我认为 2 是所有其他凸曲线的下限

我需要计算一个最小值 r=B/A,这样对于所有的凸曲线,它们总是存在一条中心凸曲线(面积为 A*r)包围它。请帮助我,非常感谢。

0 投票
1 回答
73 浏览

camera-calibration - 从鱼眼图像中采样透视(子)视图

我在尝试在鱼眼图像中选择虚拟子图像(我们称之为 ROI)时遇到问题,然后我想不失真。

我有以下鱼眼校准参数。Scaramuzza 校准模型. 我想做的是创建一个虚拟针孔相机阵列(53° FOV),它们之间有一定程度的重叠,并从鱼眼中采样它们对应的子图像。所以想象一下,我的鱼眼 FOV 大约是 180°,我想用我的 53° 虚拟摄像机覆盖整个 FOV,它们之间有 20° 重叠,也就是说,我需要大约 180/(53-20)=5.45 个摄像机(我是不是 100% 确定这个计算必须考虑更多)。如果我错了,请纠正我:不扭曲整个鱼眼图像并从那里提取针孔视图与推断鱼眼域中的 ROI 并分别不扭曲它们中的每一个是否相同?如果没有,我想第二个是正确的方法,但我应该如何进行。我如何知道鱼眼相机的哪个区域属于每个 53°FOV 相机?我的直觉告诉我,指向鱼眼边缘的那些应该比靠近中心的那些具有更扭曲的 ROI。

我不太擅长理解投影空间以及如何在其中操作。希望你们无论如何都能帮助我。

0 投票
1 回答
227 浏览

c++ - 找到一对圆锥曲线的内公切线

我一直试图让两个旋转椭圆的公切线。我在以下线程中遵循Edward Doolittle给出的方法。这两个椭圆以Wiki中给出的等式给出。

在矩阵形式中,椭圆可以显示为:
等式 1

第一个椭圆以 (0,0) 为中心旋转 45 度,半长轴和半短轴长度为 2,1。第二个椭圆以 (15,0) 为中心,旋转 120 度,半长轴和半短轴长度为 3,1

两个椭圆的伴随矩阵的线性组合是每个对偶的两个椭圆组合 等式 2
我得到这个值
等式 3

然后我试图找到 t 的值,它会使圆锥(矩阵上方)退化。

我发现 t 的值为 (-0.05,0.29,2.46)。但是,当我将这些值放回上述矩阵时,我无法将矩阵简化为两个变量的形式。我总是在处理 3 个变量。例如,如果我输入 t = -0.05,那么我会得到以下结果:

调整。 矩阵

有人可以帮我吗?