Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用大距离中的一个点(使用opencv)计算摄影机方向?_Opencv_Graphics_Computer Vision_Camera Calibration_Euler Angles - Fatal编程技术网

如何使用大距离中的一个点(使用opencv)计算摄影机方向?

如何使用大距离中的一个点(使用opencv)计算摄影机方向?,opencv,graphics,computer-vision,camera-calibration,euler-angles,Opencv,Graphics,Computer Vision,Camera Calibration,Euler Angles,假设我有一个针孔相机,它有已知的插值,比如相机矩阵和失真系数。假设有一个点离摄像机有足够大的距离,所以我们可以说它被放置在无穷远处 给定该点的图像坐标(以像素为单位),我想计算相机相对于连接相机和该点的轴的旋转(如果相机指向该点且位于图像的光学中心,则旋转为0,0) 如何使用opencv实现这一点 非常感谢 您需要指定一个附加约束-将摄影机从其当前姿势旋转到与任意光线对齐光轴的姿势,使摄影机可以围绕光线本身自由旋转(即,未指定“滚动”角度) 让我们假设您希望滚动为零,即您希望运动为纯平移-倾斜。

假设我有一个针孔相机,它有已知的插值,比如相机矩阵和失真系数。假设有一个点离摄像机有足够大的距离,所以我们可以说它被放置在无穷远处

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

如何使用opencv实现这一点


非常感谢

您需要指定一个附加约束-将摄影机从其当前姿势旋转到与任意光线对齐光轴的姿势,使摄影机可以围绕光线本身自由旋转(即,未指定“滚动”角度)

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

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

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

第一次旋转的角度为(Z和Puy之间的角度)=[90°(Z和Y之间的角度x U)]。这是因为yxu与Puy正交。在维基百科或其他在线网站上查找用于计算向量之间角度的表达式。一旦获得角度(或其余弦和正弦),围绕Y的旋转可以表示为标准旋转矩阵Ry

第二次旋转的角度,即Z位于Puy上后约X的角度,是将Y应用于Z后矢量Z和U之间的角度,或等效地,Z和inv(Ry)*U之间的角度。计算矢量之间的角度,并用于构建关于X,Rx的标准旋转矩阵


最后的转换是Rx*Ry。

谢谢,你说得对,我没有提到滚动*0。问题是,我不知道3d坐标,只知道2d像素坐标。这和相机矩阵一起,是我的出发点。我基本上需要一个来自projectPoints()的反函数。因为我没有在opencv中找到它,所以我尝试通过搜索角度来解决这个问题,直到找到投影到给定像素的一对。如果成功的话,我会发布一个解决方案。你不需要第三个坐标,只要像素就足够了。让U=[px,py,1],然后标准化为单位长度