我使用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
我正在使用“ 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
我正在尝试计算 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) 假设我想估计给定图像的相机姿势,I并且我有一组测量值(例如 2D 点 u i及其相关的 3D 坐标 P i),我想最小化误差(例如平方重投影误差的总和) )。
我的问题是:如何计算最终姿态估计的不确定性?
为了使我的问题更具体,考虑的图像I从我提取的2D点ü我和他们相匹配的三维点P我。表示Ť瓦特相机姿态为这个图象,这是我将被估计,和pi Ť变换映射3D点到其投影的2D点。这是一张小图来澄清事情:
有几种技术可以解决相应的非线性最小二乘问题,考虑我使用以下(高斯牛顿算法的近似伪代码):
我在几个地方读到 J r T .J r可以被认为是姿势估计的协方差矩阵的估计。以下是更准确的问题列表:
非常感谢,对此的任何见解将不胜感激。
algorithm opencv computer-vision uncertainty pose-estimation
我看到OpenCV的solvePnP()函数假设你的相机参数来自针孔模型。但我使用cv.fisheye模块校准了相机,所以我想知道如何使用从鱼眼模块获得的参数来使用solvePnP。
如何使用我的鱼眼相机参数solvePnP()?
如何从不同角度拍摄一个物体的两个图像,并根据另一个点在一个物体上绘制极线?
例如,我希望能够使用鼠标在左侧图片上选择一个点,用圆圈标记该点,然后在与标记点相对应的右侧图像上绘制一条极线。
我有 2 个 XML 文件,其中包含 3x3 相机矩阵和每张图片的 3x4 投影矩阵列表。相机矩阵为K。左图的投影矩阵为P_left。右图的投影矩阵是P_right。
我试过这种方法:
在左侧图像中选择一个像素坐标 (x,y)(通过鼠标点击)
计算p左图中的一个点K^-1 * (x,y,1)
Calulate伪逆矩阵P+的P_left(使用np.linalg.pinv)
计算右图e'的对极:P_right * (0,0,0,1)
计算反对称矩阵e'_skew的e'
计算基本矩阵F:e'_skew * P_right * P+
计算l'右图的极线:F * p
计算p'右图中的一个点:P_right * P+ * p
变换p'并l返回像素坐标
使用cv2.line通过p'和绘制一条线l
我很难用相机估计 Aruco 标记的位置。在我使用 DICT_6X6_250 字典和上面有 4 个 20x20 厘米标记的板进行测试时,我测量了 6 米,误差为 20-30 厘米。我需要更精确的测量。
这个错误率正常吗?我可以做什么来提高准确性?
我正在开发一个增强现实应用程序,将图形叠加到相机图像上。使用 OpenCV Pose Estimator 和设备本身的固有相机参数,我能够生成一个非常好的 OpenCV 相机矩阵和 OpenGL 透视矩阵,从而产生合理的结果。
然而,我的解决方案以及我在该论坛和其他 Internet 位置上检查过的所有类似解决方案,只是对透视矩阵近端和远端参数使用一些有些任意的值(通常为 1.0 和 100)。
然而,虽然如果感兴趣的对象不是太近,这通常是可以的,但当对象靠近视点时,它会变得更加不准确并且成为失真的来源。
实际上,随着这两个参数(近、远)的调整,透视的消失点发生变化。
有谁有更合理的方法来从可用数据中推导出近参数和远参数?
opengl opencv perspectivecamera camera-calibration pose-estimation
我从这里使用 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