openCV的triangulatePoints()的结果应该是什么样子?
what does the result of triangulatePoints() from openCV should looks like?
我正在尝试用立体相机系统对一些点进行三角测量。
首先,我使用示例"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]
的乘法。
检查结果的一种方法是使用您从立体校准中获得的R
和T
值,并创建一个基本矩阵,该矩阵将描述一台相机拍摄的图像与其他相机拍摄的图像之间的关系。
使用基本矩阵,对于相机A拍摄的图像上的每一个点,你可以在相机b拍摄的图像上画一条线,如果你可以用眼睛看到实际对应的点直接在那条线上,那就很好。
如果你对多个点重复这一点并且总是得到好的结果,你可以非常确定你的外在性质是好的,你的投影矩阵是好的。
当你通过triangulatePoints
函数得到三维点时,它们在齐次坐标(x, y, z, w)
中。该点的欧几里德坐标为(x/w, y/w, z/w)
。
注:
在纸上打印棋盘很少是一个好主意。纸通常不会完全平直。一种方法是将其打印在粘性纸上,然后将其粘合在坚硬的平面上,而不会产生气泡。您还可以尝试在计算机显示器上简单地显示棋盘图案并报告结果:)
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 返回的指向C++对象的链接是什么样的
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 对于给定的密钥,什么样的随机数生成系统会只返回一个结果