Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用基本矩阵使用OpenCV计算坐标转换_C++_Opencv_Computer Vision_Linear Algebra - Fatal编程技术网

C++ 使用基本矩阵使用OpenCV计算坐标转换

C++ 使用基本矩阵使用OpenCV计算坐标转换,c++,opencv,computer-vision,linear-algebra,C++,Opencv,Computer Vision,Linear Algebra,我试图计算两幅图像之间几个点的坐标对应关系。 我有一组点,它们的对应关系是已知的,我将它们与OpenCV的findFundamentalMatrix()一起使用,以找到基本矩阵。 我验证了每个点的x^T*F*x'=(0),结果总是正确的或非常接近 问题是,现在我想使用第一个图像上的点的坐标(y)和基本矩阵(F),以便找到第二个图像上的点的坐标(y')。我首先想到的是简单地使用上面的等式,但是只要给出y'点的z,就可能有 我还可以如何使用基本矩阵来计算平移 更清楚的是:知道基本矩阵“连接”两个投影

我试图计算两幅图像之间几个点的坐标对应关系。 我有一组点,它们的对应关系是已知的,我将它们与OpenCV的
findFundamentalMatrix()
一起使用,以找到基本矩阵。 我验证了每个点的
x^T*F*x'=(0)
,结果总是正确的或非常接近

问题是,现在我想使用第一个图像上的点的坐标(
y
)和基本矩阵(
F
),以便找到第二个图像上的点的坐标(
y'
)。我首先想到的是简单地使用上面的等式,但是只要给出
y'
点的
z
,就可能有

我还可以如何使用基本矩阵来计算平移

更清楚的是:知道基本矩阵“连接”两个投影后,如何使用它将任何已知点的坐标
(a,b,1)
从第一个投影转换到第二个投影

考虑到我们在这个方程中知道
a
b
F
:(a',b',1)T*F*(a,b,1)=(0)

我画了一张简单的图作为例子:。考虑到我们知道它在投影1中的坐标以及两个投影中所有其他点的坐标,我们的想法是在投影2中找到红点的坐标
(xq,yq)
(和其他一些算法一样,寻找基本矩阵实际上至少需要8个点)

另一个精度:在我的示例中,已知点是共面的,但研究的点不一定是共面的


我希望这能让我的问题更清楚:)

基本矩阵将点从一个图像转换为另一个图像中的线。你能详细说明一下吗

我还可以如何使用基本矩阵来计算平移

请告诉我们你想要实现什么,也许举个例子也会有帮助

编辑:如果您校准了相机,您可以从基本矩阵中计算基本矩阵
E
。E将一幅图像中的点转换为另一幅图像中的点。但是,当然,要求有内部矩阵。如果
K
是内部矩阵
E=转置(K)FK
。 另一种方法是在另一幅图像中找到一个点的对应线,然后沿着这条线搜索外观与第一幅图像中该点周围的面片最相似的面片。还有其他一些方法,但确实需要更多有关问题的信息来判断哪一个适合您的情况


编辑2:在图形中,点是共面的。因此,单应映射两个图像之间的点位置,无需找到基本矩阵。OpenCV具有估计单应的功能,只需要四个点。

给定:

图1中的点对应a

目标:

找到位于图2中所谓的极线
L
上的对应点b

怎么做?

    | x0 |       | x1 |
a = | y0 | , b = | y1 |
    | 1  |       | 1  |
L=F*a

    |F00 F01 F02|
F = |F10 F11 F12|
    |F20 F21 F22|
必须满足以下等式才能获得图2中的b

a'*F*b=0


注意:
a'=转置(a)

出于某种原因,由于缺乏声誉,我无法添加评论。 我已经研究这个领域大约一个月了,希望我能回答很多在我研究这个话题时一直困扰着我的问题

@M2X 基本矩阵是从图像平面1中的点到图像平面2中的线的映射。这些线是一种特殊类型的线,称为极线,由图像平面与由两个摄像机原点和3D点构成的平面的交点形成。因此,无法使用基本矩阵,除非您有一些附加信息或约束

@朱库尔帕 单应是一种点对点的映射,使得平行线映射到平行线。我们可以证明这种映射是线性的,因为线性映射等价于矩阵,所以单应可以由矩阵来定义。
投影到图像平面上的平面上的一组3D点将平行线映射为平行线,因此单应在您的情况下工作。书中概述了从给定点集估计单应的方法(计算机视觉中的多视图几何)。给定两幅图像中的对应点,您可以使用迭代方法(梯度下降)或闭合形式解决方案(奇异值分解)找到单应性。

如果您使用的点组来自棋盘,您可以轻松使用opencv获取内部参数(据我记忆所及,这需要几个棋盘姿势)这看起来更像是一个评论,而不是一个答案:):-)时间太长了,所以决定回答。我编辑了我的问题以添加一些信息,我希望这会有所帮助。我没有尝试OpenCV的校准,它是否需要手动输入两个摄像头的位置?请参阅我的第二次编辑。在这种情况下,点总是共面的?我很困惑。如果基本矩阵是m将图像1中的点应用于图像2,为什么不能只取基本矩阵和任何点的点积,然后在另一幅图像中得到其对应点?基本矩阵a从图像1中的点映射到图像2中的线。在链接的图中,x'映射到l',x'映射到l'。因为x'*l'=0(这是同质线和点的一个属性)和l'=Fx',我们看到,对于所有对应点集,x''Fx'=0。因此,如果您可以为场景找到一个很好的F估计值,给定F和x',您可以通过