标签: pose-estimation

五点基本矩阵估计的Sampson误差

我使用Nister中的5点方法来计算基本矩阵.使用RANSAC和Sampson误差阈值进一步改进了异常值抑制.我随机选择5个点集,估计基本矩阵并评估匹配向量的Sampson误差.Sampson误差低于阈值t(在我所拥有的示例中设置为0.01)的点坐标被设置为内点.对所有基本矩阵重复该过程,并保留具有最佳内点的分数.

我注意到d的大多数值,即sampson误差的向量太大了:例如,如果d的大小是(1x1437),如果我做g = find(abs(d)> 0.01); 长度(G)

然后长度(g)= 1425这意味着只有7个值是这个阈值的内部值,这是不正确的!

如何设置门槛?如何解释Sampson错误值?

请帮帮我.谢谢

matrix computer-vision pose-estimation ransac reprojection-error

4
推荐指数
1
解决办法
6303
查看次数

OpenCV旋转(Rodrigues)和转换向量,用于在Unity3D中定位3D对象

我正在使用“ OpenCV for Unity3d”资产(与Java的OpenCV包相同,但已转换为Unity3d的C#),以便为我的MSc论文(计算机科学)创建增强现实应用程序。

到目前为止,我已经能够使用ORB特征检测器从视频帧中检测到物体,并且还可以使用OpenCV的SolvePnP方法找到3D到2D关系(我也进行了摄像机校准)。通过这种方法,我得到了平移和旋转向量。问题发生在增强阶段,在此阶段,我必须将3d对象显示为虚拟对象,并在每个帧上更新其位置和旋转。OpenCV返回Rodrigues旋转矩阵,但是Unity3d使用Quaternion旋转,因此我错误地更新了对象的位置和旋转,因此我不知道如何实现论坛(从Rodrigues到Quaternion)。

获取rvec和tvec:

    Mat rvec = new Mat();
    Mat tvec = new Mat();
    Mat rotationMatrix = new Mat ();

    Calib3d.solvePnP (object_world_corners, scene_flat_corners, CalibrationMatrix, DistortionCoefficientsMatrix, rvec, tvec);
    Calib3d.Rodrigues (rvec, rotationMatrix);
Run Code Online (Sandbox Code Playgroud)

更新虚拟对象的位置:

    Vector3 objPosition = new Vector3 (); 
    objPosition.x = (model.transform.position.x + (float)tvec.get (0, 0)[0]);
    objPosition.y = (model.transform.position.y + (float)tvec.get (1, 0)[0]);
    objPosition.z = (model.transform.position.z - (float)tvec.get (2, 0)[0]);
    model.transform.position = objPosition;
Run Code Online (Sandbox Code Playgroud)

我的Z轴有一个负号,因为当您将OpenCV转换为Unty3d的系统坐标时,必须反转Z轴(我自己检查了系统坐标)。

Unity3d的坐标系(绿色是Y,红色是X,蓝色是Z):

在此处输入图片说明

OpenCV的坐标系:

在此处输入图片说明

另外,我对旋转矩阵做了同样的事情,并且更新了虚拟对象的旋转。

ps我发现了一个类似的问题,但提出这个问题的人没有清楚地发布解决方案。

谢谢!

c# opencv unity-game-engine augmented-reality pose-estimation

4
推荐指数
1
解决办法
7630
查看次数

计算 ArUco 标记和相机之间的距离和偏航?

我正在尝试计算 aruco 标记和相机之间的精确(3 厘米错误率是可以接受的)距离。我使用 python、opencv 和 aruco。我可以检测到它们(标记侧为 0.023 米,即 2.3 厘米)但我无法解释距离,因为对于 40 厘米的距离,平移向量的范数为 1 米。我对此很困惑。任何人都可以帮忙吗?完整代码(抱歉,没有很好地记录):

import numpy as np
import cv2
import cv2.aruco as aruco
import glob
import argparse
import math

# Marker id infos. Global to access everywhere. It is unnecessary to change it to local.
firstMarkerID = None
secondMarkerID = None

cap = cv2.VideoCapture(0)
image_width = 0
image_height = 0

#hyper parameters
distanceBetweenTwoMarkers = 0.0245  # in meters, 2.45 cm
oneSideOfTheMarker = 0.023 # in meters, 2.3 cm …
Run Code Online (Sandbox Code Playgroud)

python opencv distance pose-estimation aruco

4
推荐指数
1
解决办法
6234
查看次数

最小化测量误差时姿态估计的不确定性

假设我想估计给定图像的相机姿势,I并且我有一组测量值(例如 2D 点 u i及其相关的 3D 坐标 P i),我想最小化误差(例如平方重投影误差的总和) )。

我的问题是:如何计算最终姿态估计的不确定性?


为了使我的问题更具体,考虑的图像I从我提取的2D点ü和他们相匹配的三维点P。表示Ť瓦特相机姿态为这个图象,这是我将被估计,和pi Ť变换映射3D点到其投影的2D点。这是一张小图来澄清事情:

在此处输入图片说明

我的客观陈述如下: 最小化目标陈述

有几种技术可以解决相应的非线性最小二乘问题,考虑我使用以下(高斯牛顿算法的近似伪代码):

在此处输入图片说明

我在几个地方读到 J r T .J r可以被认为是姿势估计的协方差矩阵的估计。以下是更准确的问题列表

  1. 任何人都可以解释为什么会这样和/或知道详细解释这一点的科学文件吗?
  2. 我应该在最后一次迭代中使用 J r的值还是应该以某种方式组合连续的 J r T .J r
  3. 有人说这实际上是对不确定性的乐观估计,那么估计不确定性的更好方法是什么?

非常感谢,对此的任何见解将不胜感激。

algorithm opencv computer-vision uncertainty pose-estimation

3
推荐指数
1
解决办法
1013
查看次数

如何使用鱼眼相机参数解决 PnP 问题?

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

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

opencv camera-calibration pose-estimation opencv-solvepnp

3
推荐指数
1
解决办法
3157
查看次数

如何在 Python OpenCV 中使用立体图像对计算对极线

如何从不同角度拍摄一个物体的两个图像,并根据另一个点在一个物体上绘制极线?

例如,我希望能够使用鼠标在左侧图片上选择一个点,用圆圈标记该点,然后在与标记点相对应的右侧图像上绘制一条极线。

我有 2 个 XML 文件,其中包含 3x3 相机矩阵和每张图片的 3x4 投影矩阵列表。相机矩阵为K。左图的投影矩阵为P_left。右图的投影矩阵是P_right

我试过这种方法:

  1. 在左侧图像中选择一个像素坐标 (x,y)(通过鼠标点击)

  2. 计算p左图中的一个点K^-1 * (x,y,1)

  3. Calulate伪逆矩阵P+P_left(使用np.linalg.pinv

  4. 计算右图e'的对极:P_right * (0,0,0,1)

  5. 计算反对称矩阵e'_skewe'

  6. 计算基本矩阵Fe'_skew * P_right * P+

  7. 计算l'右图的极线:F * p

  8. 计算p'右图中的一个点:P_right * P+ * p

  9. 变换p'l返回像素坐标

  10. 使用cv2.line通过p'和绘制一条线l

python opencv computer-vision stereo-3d pose-estimation

2
推荐指数
1
解决办法
6104
查看次数

如何改进 Aruco 标记姿势估计?

我很难用相机估计 Aruco 标记的位置。在我使用 DICT_6X6_250 字典和上面有 4 个 20x20 厘米标记的板进行测试时,我测量了 6 米,误差为 20-30 厘米。我需要更精确的测量。

这个错误率正常吗?我可以做什么来提高准确性?

computer-vision pose-estimation aruco

2
推荐指数
1
解决办法
4201
查看次数

OpenGL 透视矩阵的固有相机参数:近远参数?

我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用 OpenCV Pose Estimator 和设备本身的固有相机参数,我能够生成一个非常好的 OpenCV 相机矩阵和 OpenGL 透视矩阵,从而产生合理的结果。

然而,我的解决方案以及我在该论坛和其他 Internet 位置上检查过的所有类似解决方案,只是对透视矩阵近端和远端参数使用一些有些任意的值(通常为 1.0 和 100)。

然而,虽然如果感兴趣的对象不是太近,这通常是可以的,但当对象靠近视点时,它会变得更加不准确并且成为失真的来源。

实际上,随着这两个参数(近、远)的调整,透视的消失点发生变化。

有谁有更合理的方法来从可用数据中推导出近参数和远参数?

opengl opencv perspectivecamera camera-calibration pose-estimation

1
推荐指数
1
解决办法
3877
查看次数

如何在 tflite 中使用posenet模型的输出

我从这里使用 tflite 模型进行posenet 。它接受输入 1*353*257*3 输入图像并返回 4 个维度数组 1*23*17*17、1*23*17*34、1*23*17*64 和 1*23*17*1。该模型的输出步长为 16。如何获取输入图像上所有 17 个姿势点的坐标?我尝试从 out1 数组的热图中打印置信度分数,但每个像素的值接近 0.00。代码如下:

public class MainActivity extends AppCompatActivity {
private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
private static final int MY_CAMERA_PERMISSION_CODE = 100;
Interpreter tflite = null;
private String TAG = "rohit";
//private Canvas canvas;

Map<Integer, Object> outputMap = new HashMap<>();
float[][][][] out1 = new float[1][23][17][17];
float[][][][] out2 = new float[1][23][17][34];
float[][][][] out3 = new float[1][23][17][64];
float[][][][] out4 = new float[1][23][17][1]; …
Run Code Online (Sandbox Code Playgroud)

android computer-vision pose-estimation tensorflow tensorflow-lite

1
推荐指数
1
解决办法
6094
查看次数