我试图对立体相机系统中的某些点进行三角测量。
首先,我使用了样本" stereo_calib" (cpp)获取yml文件中的外部参数:
有没有办法检查这些值是否正确?
然后我使用方法:
cvTriangulatePoints(CvMat* projMatr1, CvMat* projMatr2, CvMat* projPoints1, CvMat* projPoints2, CvMat* points4D)
我使用P1作为projMatr1,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;
我为projPoints1使用了point1,为projPoints2使用了point2。 我在最后的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了解吗?我对此并不了解。
我发现了这个相关的问题:How to correctly use 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格式纸上使用了doc print中的棋盘。
答案 0 :(得分:2)
您应该首先单独校准您的相机并获得两者的内在矩阵。
然后你可以使用特殊标志运行立体声校准,表明你只搜索外在属性(摄像机彼此之间的关系)。
投影矩阵(如P1和P2)本质上是相机的内在矩阵C
和相机的外在矩阵[R|t]
的乘法。
检查结果的一种方法是使用从立体声校准中获得的R
和T
值,并创建一个基本矩阵,用于描述一台摄像机拍摄的图像与拍摄的图像之间的关系其他人来了。
使用基本矩阵,对于摄像机A拍摄的图像上的每个点,您可以在摄像机B拍摄的图像上画一条线。如果您能用眼睛看到实际对应点直接放在该线上,那就很好了
如果你为多个点重复这一点并且总能得到好的结果,你可能会确定你的外在属性是好的并且你的投影矩阵很好。
当triangulatePoints
函数得到3d点时,它们处于齐次坐标(x, y, z, w)
。该点的欧几里德坐标为(x/w, y/w, z/w)
。
旁注:
在纸上打印棋盘不是一个好主意。纸张通常不是完全平直的。一种方法是将其打印在粘纸上并将其粘附在硬质平面上而没有下面的气泡。 您还可以尝试在计算机显示屏上简单地显示棋盘图案并报告结果:)