首页 > 解决方案 > 从二维图像中查找相机方向和平移

问题描述

目标 ::

我打算将上传的图像作为静态背景,并在该图像的指定平面上渲染 3d 对象。

我需要获取相机相对于飞机的方向。这样我就可以在所述平面上正确渲染 3D 模型。

用户将指定平面的长度和宽度。以及勾勒出平面的轮廓,形成平面的 4 个角(二维图像上的 A、B、C、D)。

图表


我试过的::

我看过使用 webassembly 移植的 OpenCV,特别是solvePnP,但是在测试时我得到了错误Uncaught TypeError: Cannot read property '$$' of undefined at RegisteredPointer.nonConstNoSmartPtrRawPointerToWireType

我在下面使用的代码:

// 3D world coords
var vv = cv.matFromArray( 4,3,cv.CV_32SC1,[
    0,0,0,
    0,4,0,
    8,4,0,
    8,0,0,
])

// 2D img coords
var imageP = cv.matFromArray( 4,2,cv.CV_8S,[
    292,272,
    72,379,
    487,530,
    701,470,
])

// camera internal params
var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())

var rvec
var tvec
cv.solvePnP( vv, imageP, cm, new cv.Mat(), rvec, tvec, false, cv.SOLVEPNP_P3P )

使用已知变量,是否可以收集有关相机方向/位置/FOV 的任何信息?

标签: opencv3dcamera-calibrationperspectivecamera

解决方案


答案有点复杂。

首先,您必须校准相机才能获得 cameraMatrix。您还应该消除沿途的失真,

var cm = new cv.Mat(3,3,cv.CV_32FC1,new cv.Scalar())

在你的代码中,你只是声明了它,并没有给它添加任何内容。并且数学需要如下所示 然后您需要知道对象的物理尺寸才能做到这一点。在此处输入图像描述 在此处输入图像描述

您开始的最简单方法是使用棋盘校准模式样本,您可以预先输入其大小。

您可以按照此示例了解如何查找相机方向和与预定对象的相对位置。

https://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html

实现你想要的源代码在这里 https://github.com/opencv/opencv/blob/master/modules/calib3d/src/calibration.cpp

从第 1400 行开始。

可以在此链接中找到带有 AR 的示例结果 https://www.youtube.com/watch?v=2hek-DmiGEw 在此处输入图像描述

在此处输入图像描述


推荐阅读