opencv - 如何使用远距离的一个点(使用opencv)来计算相机方向?

假设我有一台针孔相机,它具有已知的intristic值,例如相机矩阵和失真系数。假设有一个点距离相机足够远,所以可以说它位于无限远处。

给定该点的图像坐标(以像素为单位),我想计算相对于连接该点和该点的轴的相机旋转(因此,如果将相机对准此点并且在图像的光学中心,则旋转为0,0 )。

如何使用opencv完成?

非常感谢!

最佳答案

您需要指定其他约束条件-将摄影机从其当前姿势旋转到使光轴与任意光线对齐的位置,使摄影机可以围绕光线本身自由旋转(即,未指定“横滚” Angular )。

假设您希望滚动为零,即您希望运动为纯水平倾斜。只要您要对齐的光线不平行于垂直图像轴(在这种情况下摇摄和摇晃都是相同的运动),这就有一个独特的解决方案。

然后,解的计算如下。让我们使用OpenCV相机框架:Z = [0,0,1]'(其中“'”表示转置)是相机聚焦轴,朝向镜头外,Y = [0,1,0]'垂直轴朝下,X = Z x Y(其中“x”是叉积),水平相机轴朝图像右侧。因此“平移”是围绕Y的旋转,“倾斜”是关于X的旋转。

令U = [u1,u2,u3]',其中||你|| = 1是要旋转到的光线。您想要应用一个将Z带到 vector u和Y定义的平面Puy上的平移,然后应用一个将Z带到u上的倾斜。

第一次旋转的 Angular 是(Z和Puy之间的 Angular )= [90度-(Z和Y之间的 Angular x U)。这是因为Y x U与Puy正交。查找表达式,以计算Wikipedia或在线其他位置上的 vector 之间的 Angular 。一旦有了 Angular (或其余弦和正弦),围绕Y的旋转就可以表示为标准旋转矩阵Ry。

第二次旋转的 Angular ,即Z到达Puy之后大约为X的 Angular ,是将Ry应用于Z之后 vector Z与U之间的 Angular ,或者等效地为Z与inv(Ry)* U之间的 Angular 。计算 vector 之间的 Angular ,并用于建立有关X,Rx的标准旋转矩阵

最终的变换为Rx * Ry。

https://stackoverflow.com/questions/24250350/

相关文章:

amazon-web-services - 将 s3fs 挂载为 docker 卷

python - 如何将python list [a,b,c,d]转换为[a:b,c:d]格式

opencv - 如何在openCV中的图像上绘制不同的形状?

docker - 如何创建docker卷设备/主机路径

opencv - 使用眼睛位置作为引用裁剪检测到的面部

opencv - 在cmake生成的项目中指定libstd

docker - Tensor Flow服务docker无效字段

opencv - 如何使用opencv在鱼眼校正图像中绘制内接矩形?

python - OpenCV VideoCapture仅在5个read()之后更新

python - OpenCV和Python:knnMatch参数问题