当前位置: 首页 > 知识库问答 >
问题:

OpenCV:从平移和旋转得到透视矩阵

浦德义
2023-03-14

基本上,我想做的过程描述在这里(特别是看到图像接近尾声),但从一个已知的相机模型和姿态开始。

是否有一个直接的函数调用来获取相机的内部和外部参数,并计算透视矩阵以用于warpperspective

在对图像调用underist之后,我将调用warpperspective

原则上,在指定约束z=0之后,我可以通过求解opencv摄像机校准文档顶部定义的方程组来导出解决方案,但我认为必须有一个罐装例程来允许我正射校正我的测试图像。

在我的搜索中,我发现很难通过所有的立体声校准结果--我只有一个相机,但想要纠正图像的约束下,我只看到一个平面测试图案。

共有1个答案

羊慈
2023-03-14

实际上不需要有一个正射摄影机。以下是如何获得适当的透视图转换。

如果您使用cv::calibrateCamera校准相机,您将获得相机矩阵K镜头失真系数的矢量D以及您使用的每个图像的旋转矢量RVEC(您可以使用cv::rodrigues,doc将其转换为3x3矩阵R)和平移矢量T。考虑其中一个映像以及相关联的RT。使用失真系数调用cv::undarist后,图像将像是由投影矩阵k*[rt]的相机获取的。

基本上(正如@DavidNilosek直觉的那样),您希望取消旋转并获得图像,就像它是由形式K*[I-C]的投影矩阵获取的一样,其中C=-R.inv()*T是相机位置。为此,您必须应用以下转换:

Hr = K * R.inv() * K.inv()

唯一的潜在问题是扭曲的图像可能会超出图像平面的可见部分。因此,您可以使用附加的转换来解决该问题,如下所示:

     [ 1  0  |         ]
Ht = [ 0  1  | -K*C/Cz ]
     [ 0  0  |         ]

其中Cz是C沿Oz轴的分量。

最后,根据上述定义,h=Ht*hr是考虑图像的校正透视变换。

 类似资料:
  • 在用CV::SolvePnPransac估计摄像机姿态时,输入是objectPoints和ImagePoints。输出是旋转和平移矩阵,加上内点数 利用遗传算法生成一个新的旋转平移矩阵。我喜欢用我的新的旋转和平移来计算内点的数目。 谢谢你的支持

  • 可以使用类的方法对图像执行旋转操作。以下是这种方法的语法 - 该方法接受以下参数 - src - 表示此操作的源(输入图像)的对象。 dst - 表示此操作的目标(输出图像)的对象。 rotationMatrix - 表示旋转矩阵的对象。 size - 表示输出图像大小的整数类型变量。 示例 以下程序演示如何旋转图像。 假定以下是上述程序中指定的输入图像:。 执行上面示例代码,得到以下结果 -

  • 假设我使用大小为8的字符数组来表示图像的碰撞掩码。字符的每一位代表一个像素。实际上,对于64x64矩阵,我将使用长[64]阵列。 因此,框将显示为: 45度的示例输出应该是这样的,尽管旋转可以是任何角度。这个形状对于45度旋转可能不准确,因为我是用手做的。 另一个例子是向右旋转10度?这些值可能是错误的,因为从数学上讲,我不知道它将如何精确旋转,但我认为可以安全地假设,如果每个位的覆盖率超过旧形状

  • 我有两个矩形:红色和绿色。对于它们中的每一个,我有以下信息: 中心点( 和 坐标)。 旋转角度 宽度和高度 矩形将始终以正坐标移动。编辑:没有坐标可以是负的:矩形总是位于正坐标。因此,中心永远不会是(0,0)。 问题 我有一个起始位置。为了简化示例,假设我的红色和绿色矩形的位置如下: 现在,我使用0º和90º之间的角度φ旋转红色矩形。但是,绿色矩形需要旋转并保持其相对于红色矩形的位置。绿色矩形不仅

  • 我正在尝试在虚拟桌面程序的API中编写脚本(javascript),以便我可以操作一些令牌(Car Wars :))。 我正在寻找答案,但似乎我正在挣扎并重新发明轮子,所以我想我会寻求帮助。我感到困惑的一个原因是程序返回基于y是向下的结果,Deg顺时针方向,这与所有trig公式想要的(逆时针方向和y是向上的)不同。 这是我可以访问的内容。矩形围绕中心、中心点 (x,y)、宽度、高度和旋转旋转。我有

  • 下面是我的JNI代码: JNIEXPORT jint JNICAL Java_org_opencv_samples_tutorial3_Sample3Native_FindSquares( } final_mat通道类型正在变为CV_32FC1。如何将频道类型转换为CV_8UC4,请帮我找出解决方法。 编辑:我已将finat_mat图像更改为CV_8UC3 但我得到空白(黑色)图像的结果??