在您的帮助下,我已经能够使用CvPosit估计相机姿势(使用此链接http://www.aforgenet.com/articles/posit/)。我正在使用MATLAB代码。
现在我希望通过在图像坐标上投射3D点来验证该姿势。详情如下:
假设多维数据集的图像点数和世界点数为:
World Points=[28 28 -28;-28 28 -28;28 -28 -28, 28 28 28]
Image_Points=[-4 29;-180 86;-5 -102;76 137];
获得的姿势是:
Pose =[0.896 0.0101 0.4439 -13.9708;-0.3031 0.7127 0.6326 13.7039;-0.3100 -0.701 0.6416 164.5663;0 0 0 1];
我在我的例子中使用了640作为焦距。现在从这个姿势开始,我想使用3D点并将其投影回来以获得2D图像点。理想情况下,我应该得到同样的观点。但我无法得到它。我在MATLAB中使用以下方式:
我们说P = [28;28;28;28;1] % 4 X 1 matrix for a 3D point
P_Camera= Pose * P;
Calibration Matrix (K)=[640 0 0 0;0 640 0 0;0 0 1 0;0 0 0 1];
Image Points= P_Camera*K;
我得到x = 15251
和y = 27447
。我不知道我在这里做错了什么。请帮帮我!!
答案 0 :(得分:1)
相机姿势或相机外部参数由旋转R和平移t组成。我相信你的Pose矩阵实际上是[R t; [0 0 0 1]]
。要将3D均匀点(4x1)转换为相机坐标,您需要:
Xcam = K*[R t]*Xworld
其中K是3x3 camera matrix,包含相机内部(内部)参数。 如果您将K设置为:
,请稍微使用您的数字K =
3.3202 0 -0.0229
0 3.3202 0.0153
0 0 1.0000
你会得到一个接近的答案(这个K不适合你的F = 640的数据,但它是带有输入点和姿势的LS解决方案)。 但仍有一些错误。尝试校准相机并考虑光学失真(Matlab here有一个很好的相机校准工具箱。