opencv - 从二维图像中查找相机方向和平移
问题描述
目标 ::
我打算将上传的图像作为静态背景,并在该图像的指定平面上渲染 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 的任何信息?
解决方案
答案有点复杂。
首先,您必须校准相机才能获得 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
推荐阅读
- c++ - Good() 和 fail() 理解
- reactjs - React - Firebase _ 错误:名为“[DEFAULT]”的 Firebase 应用程序已存在
- java - 比较器使用 nullsFirst 对用户定义的对象进行排序
- r - 无法安装 rtools
- python - 如何在 Pandas 中附加列表?
- c# - 获取“权限被拒绝(密码)”。在 SSH.NET 中进行多因素身份验证(密钥和密码)时
- angular - 角度路由未重定向到正确的组件
- javascript - 如何将全名分解为多个部分并插入多个形式?
- java - 无法将数据绑定到 recyclerView
- python - 为 keyPressEvent 子类化 QTextEdit 是唯一的方法吗?