查找2D图像的相机方向和/和平移

时间:2019-05-21 17:57:51

标签: opencv 3d camera-calibration perspectivecamera

目标::

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

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

用户将指定平面的长度和宽度。不仅勾勒出平面轮廓,还产生平面的4个角(在2D图像上为A,B,C,D)。

diagram


我尝试过的事情::

我已经看过使用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的任何信息?

1 个答案:

答案 0 :(得分:0)

答案有点复杂。

首先,您必须校准相机以获取cameraMatrix。您还应该一路消除失真,

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

在您的代码中,您只声明了它,而没有添加任何内容。数学需要它,如下所示 enter image description here enter image description here 那么您需要知道对象的物理尺寸才能做到这一点。

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

您可以按照以下示例来查找如何找到相机方向和相对于预定对象的相对位置。

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 enter image description here

enter image description here