openCV的triangulatePoints()的结果应该是什么样子?

what does the result of triangulatePoints() from openCV should looks like?

本文关键字:什么样 结果 triangulatePoints openCV      更新时间:2023-10-16

我正在尝试用立体相机系统对一些点进行三角测量。

首先,我使用示例"stereo_calib"(cpp)在一个yml文件中获取外部参数:
  • R
  • T
  • R1
  • R2
  • P1
  • P2
  • Q

是否有办法检查值是否正确?

然后我使用方法:

cvTriangulatePoints(CvMat* projMatr1, CvMat* projMatr2, CvMat* projPoints1, CvMat* projPoints2, CvMat* points4D) 

我用P1表示projmat1,用P2表示projMatr2。

我要三角测量的点在左边图像的坐标x=919,y=686,右边图像的坐标x=586,y=694。我试过了,但我不确定这是否是好方法:

int co1[] = {919,686};
Mat point1(2, 1, CV_32FC1, co1);
int co2[] = {586,694};
Mat point2(2, 1, CV_32FC1, co2);
Mat points4D;

我用point1表示projPoints1,用point2表示projPoints2。最后我在一个yml文件中写了points4D。这是我得到的结果:

%YAML:1.0
Points4D: !!opencv-matrix
    rows: 4
    cols: 1
    dt: f
    data: [ 2.34857202e-001, 1.03716120e-001, -9.66480732e-001,
            1.43435571e-007 ]

这是什么意思?前三个值是重构点的x, y和z ?这些值对我来说似乎很奇怪,但我真的知道openCV,我对它知之甚少。

我发现了这个相关的问题:如何正确使用cv::triangulatePoints()。但它并没有真正帮助我…

谢谢你的帮助!

编辑

校准给了我这个:

P1: !!opencv-matrix
    rows: 3
    cols: 4
    dt: d
    data: [ 1.5334888857352591e+003, 0., 1.1192188110351562e+003, 0., 0.,
            1.5334888857352591e+003, 9.1114062500000000e+002, 0., 0., 0., 1.,
            0. ]
P2: !!opencv-matrix
    rows: 3
    cols: 4
    dt: d
    data: [ 1.5334888857352591e+003, 0., 1.1192188110351562e+003,
            4.3953258083993223e+003, 0., 1.5334888857352591e+003,
            9.1114062500000000e+002, 0., 0., 0., 1., 0. ]

我在A4格式的纸上使用了文档中的棋盘。

您应该首先分别校准您的相机并获得它们的固有矩阵。

然后你可以运行带有特殊标志的立体校准,表明你只搜索外部属性(相机之间的关系)。

投影矩阵(如P1和P2)本质上是相机的内在矩阵C和相机的外在矩阵[R|t]的乘法。

检查结果的一种方法是使用您从立体校准中获得的RT值,并创建一个基本矩阵,该矩阵将描述一台相机拍摄的图像与其他相机拍摄的图像之间的关系。

使用基本矩阵,对于相机A拍摄的图像上的每一个点,你可以在相机b拍摄的图像上画一条线,如果你可以用眼睛看到实际对应的点直接在那条线上,那就很好。

如果你对多个点重复这一点并且总是得到好的结果,你可以非常确定你的外在性质是好的,你的投影矩阵是好的。

当你通过triangulatePoints函数得到三维点时,它们在齐次坐标(x, y, z, w)中。该点的欧几里德坐标为(x/w, y/w, z/w)

注:

在纸上打印棋盘很少是一个好主意。纸通常不会完全平直。一种方法是将其打印在粘性纸上,然后将其粘合在坚硬的平面上,而不会产生气泡。您还可以尝试在计算机显示器上简单地显示棋盘图案并报告结果:)