问题标签 [opencv-solvepnp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
170 浏览

opencv - SolvePnp 不给出相同的结果与四个点和更多的点

我正在使用库的SolvePnP功能计算相机的姿势,OpenCv我面临的问题是,当我给四分时,它给我的结果比我给更多分时稍微好一点。以下是代码示例,其中包含一些要点:

我确实得到:

与外部结果(激光)相比,对我来说,我应该获得更多的精度,或者至少是相同的结果,但似乎并非如此。比较时我得到更好的结果,有四分X, Y and Z

我的代码有问题吗?

PS:model_points_four并且model_points_eleven在3D世界和图像中具有相同的原点。

0 投票
0 回答
651 浏览

python - solvePnP 结果与预期结果相差太大(Python、OpenCV)

我有一辆车,上面有一个摄像头、一个 imu 和一个 gps。相机一边开车一边拍照。图片和gps坐标是同步的。现在,我试图从图片中获取相机姿势(相对于 imu),但solvePnP最终没有得到与我预期结果相似的外部相机校准。

更多背景信息:我正在使用 Python (3.6.8) 和 OpenCV 4.0.0。

我知道的以下数据:

  1. 我有 8 个标记及其在世界坐标中的确切位置。
  2. 我在世界坐标中有imu的轨迹。
  3. 我有几张图片(6576 x 4384 px)的标记的像素坐标。
  4. 我有内在的相机校准。

目前,我的流程包括:

  1. 我将所有世界坐标转换为本地标记坐标系,以便所有标记的 z 坐标为 0(参见代码示例中的 Out[4])。起初,我在没有这一步的情况下尝试过,但我阅读了很多教程,似乎校准以某种方式假设了这一点,但我不确定。如果我错了,请纠正我。
  2. solvePnP用来获取rvectvec
  3. 我申请cv2.Rogrigues(rvec)获得rotationMatrix
  4. 然后,标记坐标中的相机位置由下式计算camPos = -np.matrix(rotationMatrix).T * np.matrix(tvec)

之后,我比较了 imu 和估计的相机位置之间的距离,结果大约是 1m,但甚至不一致。这些是 5 个样本图像的结果。

但是,imu 和摄像头之间的距离应该是 2.4m(手动测量)并且完全没有变化(因为两者都固定在车顶)。

solvePnP 是否有可能输出错误的结果,或者我是否在我的过程中的其他地方犯了错误?

类似的问题,但没有答案将是this

0 投票
0 回答
87 浏览

opencv - 如何在不了解相机 fov 的情况下从单个图像解决 pnp 问题?

我有一个对象的模型和对象的图像,并试图将对象与图像对齐。相机姿势和 fov 未知,因为图像是从不同的用户收集并使用不同的相机拍摄的。

我现在做的是假设 fov 为 60 度,并用 solvPnp 解决这个问题。但是,结果并不好,除非使用正确的 fov 信息。

OpenCV中是否有解决此类问题的功能?

0 投票
0 回答
344 浏览

opencv - 姿势估计 - 带有 Scenekit 的 cv::SolvePnP - 坐标系问题

我一直在使用 Apples Vision 框架中的特征/关键点,通过 OpenCV 的 cv::solvePNP 进行姿势估计(校正 3D 模型上的关键点和图像上的 2D 点以匹配姿势)。

TL-DR:

我的场景套件模型正在被平移,并且在从solvePnP自省平移和旋转向量时,单位看起来是正确的(即它们是正确的数量级),但是平移的坐标系出现了:

姿态估计尝试示例

我正在尝试使用solvePnP wrt对Metal / OpenGL坐标系和我的相机投影矩阵来了解坐标系要求。

我的 SCNCamera 需要什么“projectionMatrix”来匹配传递给solvePnP 的基于图像的坐标系?

我读过/相信我正在考虑的一些事情。

  • OpenCV vs OpenGL(因此金属)具有行主要与列主要差异。
  • OpenCV 的 3D 坐标系不同于 OpenGL(因此是 Metal)。

更长的代码:

我的工作流程是这样的:

第 1 步 - 使用 3D 模型工具检查我的 3D 模型上的点,并获取 2D 检测到的特征中主要关键点的对象顶点位置。我正在使用左瞳孔,右瞳孔,鼻尖,下巴尖,左外唇角,右外唇角。

第 2 步 - 运行视觉请求并提取图像空间中的点列表(转换为 OpenCV 的左上角坐标系)并提取相同的 2D 点有序列表。

第 3 步 - 使用输入图像的大小构造相机矩阵。

第 4 步 - 运行 cv::solvePnP,然后使用 cv::Rodrigues 将旋转向量转换为矩阵

第 5 步 - 将生成的变换的坐标系转换为适合 GPU 的坐标系 - 反转 y 轴和 z 轴并将平移和旋转组合为单个 4x4 矩阵,然后将其转置为 OpenGL/Metal 的适当主干

第 6 步 - 通过以下方式将生成的变换应用到 Scenekit:

下面是我的 Obj-C++ OpenCV 包装器,它包含视觉地标的子集和正在查看的图像的真实像素大小:

一些问题:

  • SCNNode 没有 modelViewMatrix (正如我所理解的那样,一个变换,即 modelMatrix )只是抛出一个矩阵 - 所以我已经从 SolvePNP 过程中读取了变换的逆可以用来代替相机,哪个似乎让我得到了关闭结果。我想确保这种方法是正确的。

  • 如果我有modelViewMatrix和projectionMatrix,我应该能够计算出合适的modelMatrix吗?这是我应该采取的方法吗?

  • 我不清楚我应该为我的 SceneKit 场景使用什么投影矩阵,以及这是否对我的结果有任何影响。我是否需要一个像素以使我的视口与图像大小完全匹配,以及如何正确配置我的 SCNCamera 以确保 SolvePnP 的坐标系一致性?

非常感谢!

0 投票
1 回答
1924 浏览

ios - 使用 solvePnP() 和 SOLVEPNP_IPPE_SQUARE 方法进行相机位姿估计

我正在使用 ARKit 并尝试从已知大小(0.16m)的 QR 码中获取相机位置。为了检测 QR 码,我正在使用 Vision 框架,这样我就可以获取图像上的每个角点。

资料准备:

为了获得相机位置,我使用 OpenCV 解决方案solvePnP()与 flag = SOLVEPNP_IPPE_SQUARE

基于此答案的 Objective-C++ 中的 OpenCV :

问题是当我将相机直接指向 2 米距离的二维码时,translationVector 的结果。z ( tvec scenekit ) 应该等于 2 米,但是有一个随机的正数或负数。

输出:

谢谢你的帮助

0 投票
0 回答
555 浏览

javascript - 使用 projectPoints + solvePnP 的包装器构建 OpenCV.js

移植到 JavaScript:“无法注册公共名称 'projectPoints' 两次”

我做了以下事情:

  1. git 克隆https://github.com/opencv/opencv.git

  2. git 克隆https://github.com/opencv/opencv_contrib.git

  3. 我在 opencv/platforms/js/build_js.py 的 def get_build_flags(self) 中添加了以下内容: flags += "-s USE_PTHREADS=0 "

  4. 我在 def get_cmake_cmd(self): of opencv/platforms/js/build_js.py: 中启用了构建标志:-DBUILD_opencv_calib3d设置为ON

  5. 我添加了以下 def get_cmake_cmd(self): 的 opencv/platforms/js/build_js.py:-DOPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules

  6. js在 opencv/modules/calib3d/CMakeLists.txt 的 WRAP 列表末尾附加了 ocv_define_module。在 opencv/modules/features2d/CMakeLists.txt 和 opencv_contrib/modules/aruco/CMakeLists.txt 中,我还在 ocv_define_module 中添加了“js”参数。

  7. solvePnP在 opencv/modules/js/src/embindgen.py 的 calib3d 模块中添加了和“projectPoints”

calib3d = {'':['findHomography','calibrateCameraExtended','drawFrameAxes','getDefaultNewCameraMatrix','initUndistortRectifyMap','solvePnP','projectPoints']}

  1. 我将 calib3d 模块添加到 opencv/modules/js/src/embindgen.py 中的 makeWhiteList

white_list = makeWhiteList([核心,imgproc,objdetect,视频,dnn,features2d,照片,aruco,calib3d])

  1. 我添加了“使用命名空间 aruco;” 在 opencv/modules/js/src/core_bindings.cpp

  2. 我使用以下命令构建了 OpenCV.js: sudo python ./platforms/js/build_js.py build_js --emscripten_dir=${ESCRIPTEN} --clean_build_dir --build_test

在添加这些包装器之前,它编译得很好,没有错误。现在在我的 tests.html 中,我收到以下消息:

所以似乎重载函数阻止我将它们移植到 JavaScript。

请问有什么建议可以解决吗?

在此先感谢您的帮助。

0 投票
0 回答
226 浏览

motion - 如何使用两个摄像头提高物体姿态估计solvePnP的精度?

目前,我正在使用两个摄像头来估计物体的姿势(CharucoBoard)。

我已经尝试通过solvePnP 使用一台相机来获取CharucoBoard 的姿势。但是,前后平移轴仍然呈线性趋势。因此,我想在立体设置中使用两个摄像头以实现更高的精度。

我仍然不知道如何实现这个想法。我的猜测是使用triangulatePoints函数获取对象的 3D 世界坐标,然后将它们重新输入到solvePnP算法中,它应该工作还是有其他建议?

0 投票
1 回答
1580 浏览

opencv - 如何使用鱼眼相机参数解决 PnP?

我看到 OpenCV 的 solvePnP() 函数假设您的相机参数来自针孔模型。但是我使用模块校准了我的相机cv.fisheye,所以我想知道如何使用从该鱼眼模块获得的参数的solvePnP。

如何使用我的鱼眼相机参数solvePnP()

0 投票
0 回答
949 浏览

opencv - OpenCV 投影点与 Unity 相机视图不匹配

我们正在开发一个 AR 应用程序,在该应用程序中,我们需要在对象的视频流上叠加对象的 3D 模型。Unity 场景包含 3D 模型,并且摄像机正在拍摄 3D 对象。相机姿势最初是未知的。

我们尝试过的

我们没有找到直接在 Unity 中估计相机位姿的好方法。因此,我们使用了OpenCV,它提供了一个广泛的计算机视觉函数库。特别是,我们定位Aruco 标签,然后将它们匹配的 3D-2D 坐标传递给solvePnp.

solvePnp返回与现实一致的相机位置,最多几厘米。我们还验证了低的重投影误差。

Aruco 标签的重投影

每个使用过的标签角都被重新投影并在图像上显示为一个红点。如您所见,差异很小。

这些结果看起来不错,应该足以满足我们的用例。因此,我们根据现实和 OpenCV 验证相机姿势。

问题

然而,当将相机放置在 Unity 场景中的估计姿势时,3D 对象并没有很好地对齐。

标记和视频流的统一视图

在此 Unity 屏幕截图中,您可以看到虚拟(Unity 对象)绿色标签的视图与视频源中的真实标签不匹配。

可能的根本原因

我们确定了可以解释 Unity 和 OpenCV 之间不匹配的不同可能根本原因:

  • 相机内在参数的差异:我们尝试了不同的参数集,但都没有绝对成功。我们首先使用 OpenCV 校准相机并尝试将参数反向移植到 Unity。我们还查看了制造商数据,但没有提供更好的结果。最后,我们手动测量了视野 (FoV) 并将其与已知的相机传感器尺寸相结合。这些测试之间的结果没有太大差异。
  • Unity 和 OpenCV 之间相机模型的差异:OpenCV 适用于针孔相机模型,但我无法找到 Unity 模拟哪个模型的结论性答案。

备注

我们的相机具有大视野 (115°)。

传递给 OpenCV 和 Unity 的图像都没有失真。

我们经历了大多数标记为 OpenCV 和 Unity 的 SO 问题。大多数 人都关心不同的坐标系和旋转约定。在我们的案例中,这似乎不是问题,因为相机显示在 3D Unity 场景中的预期位置。

问题

  1. Unity 和 OpenCV 使用的相机模型有什么根本区别吗?
  2. 您是否看到任何其他可能的原因可以解释 Unity 和 OpenCV 之间的投影差异?
  3. 你知道在没有 OpenCV 的情况下估计相机姿势的任何可靠方法吗?
0 投票
0 回答
187 浏览

python - What units does SolvePNP use?

So I am trying to use openCV's solvePNP (with python) for the first time, and I am having some troubles with the inputs. I assume that the image points are just the pixel coordinates, and the object points are a 3d list of points, in the same order, in millimetres.

However, I'm not sure which units the Intrinsic Matrix and the Distortion are in. I read some references to "35mm units", as well as other places which multiply Focal Length with Resolution and divide by Sensor sizes. I'm also not sure how to calculate the distortion values. I assume I can approximate them as 0, but if I do choose to find them, what units will they be/need to be?