【问题标题】:How to Guess the 6-D Location of an Object relative to a calibrated Camera如何猜测物体相对于校准相机的 6-D 位置
【发布时间】:2018-01-28 16:42:41
【问题描述】:

我使用 MATLAB 的 Camera Calibrator App 使用棋盘格校准了单声道相机。 从这里我得到了保存在calibrationSession中的所有相机参数。

我用同一台相机拍摄了一个物体 (sceneImage)。 我还有一张简单的图片,只显示了没有任何旋转的对象(objImage)。 而且我知道物体的真实宽度和高度。

使用 SURF 特征检测器,我提取了其中的特征并与之匹配。

现在我想猜测/计算物体的 6-D 位置,我知道它的特征,在我用校准的相机拍摄的照片中。

目前有我的 MATLAB 代码:

% IMPORTS
model = imread('model.png');
scene = imread('scene.png');
load('calibrationSession');

% IMG PREP
cameraParams = calibrationSession.CameraParameters;
objImage = rgb2gray(model);
[sceneImage, newOrigin] = undistortImage(rgb2gray(scene),cameraParams);

I1 = sceneImage;
I2 = objImage;

% DETECTION
points1 = detectSURFFeatures(I1);
[features1, valid_points1] = extractFeatures(I1, points1);

points2 = detectSURFFeatures(I2);
[features2, valid_points2] = extractFeatures(I2, points2);

[indexPairs,matchmetric] = matchFeatures(features1,features2);

matchedPoints1 = valid_points1(indexPairs(:,1),:);
matchedPoints2 = valid_points2(indexPairs(:,2),:);

% LOCATION
objwidth = 126;
objheight = size(I2,2)*objwidth/size(I2,1);

【问题讨论】:

  • 嘿!只是想知道你最终对这个问题做了什么?此外,在查看您的历史后,友好的抱怨:我认为如果您可以与回答您的人进行一些互动会很酷。否则……有什么意义?
  • 您好,谢谢,抱歉没有回复。但是我仍然对stackoverflow如何不允许初学者正确交互感到有些困惑,就像我不允许编写cmets,除非它们低于我自己的答案和类似的东西。我也经常得到一个像这里一样的-1来问一个问题,我想为什么?长话短说,我在 matlab 中退出了这项任务,因为问题是我无法让 SURF 检测场景中对象的 4 个边缘,此外,因为它是我研究的一部分,结果证明可以编译解决方案不是绝对必要的。
  • 编辑:我仔细检查了我所有的问题,并且几乎在所有情况下我都与给出答案的人进行了互动。这个话题我忘记了,因为我在 2 月份完成学业后就失去了意义,抱歉。

标签: matlab computer-vision location camera-calibration


【解决方案1】:

您的问题没有准确描述相机/物体运动的类型,所以我只假设相机移动得足以让我们有一个基线(估计深度)。然后,我们首先假设对象是静态的。在这种情况下,我建议您首先尝试更经典的方法:首先计算拍摄图像的两个瞬间之间的相对运动,i.e 在两个相机之间。如果你的特征匹配正确,这可以通过计算基本矩阵轻松完成(参见this matlab guide。我个人更喜欢this paper的方法,但需要时间来实现)。一旦有了基本矩阵,您就可以轻松地以旋转和平移([R|T])矩阵的形式提取相对运动。现在您可以对特征点进行三角测量并获得稀疏的 3d 地图。但是,您的T 只能按比例确定,因此您对对象大小和位置的估计也是如此。

这就是您想要开始利用您对对象宽度和高度的了解的地方。如果对象很简单(一个立方体),并且动作不太剧烈(例如没有倒置等),那么您可以从中推断出比例。例如,在立方体的情况下,假设您的第一张图像只是一张脸的视图,即图像看起来像

A ----- B
|       |
|       |
C-------D

现在您已经对特征点进行了三角剖分,您有四个点{P_A,P_B,P_C,P_D} 对应于立方体上点的按比例缩放 3d 位置。

既然你知道宽度/高度,你一定有

scale_factor*(P_A-P_C)==height
scale_factor*(P_B-P_A)=width

因此,这为您提供了一种估计对象位置/方向变化的方法。但它可能不是一个强大的解决方案,并且只能在非常简单的情况下工作。

如果对象不是静态的,那么其特征相对于您计算的 Essential 而言将是异常值,因此它们不会被三角剖分。这个问题要困难得多,但我怀疑可能有一个解决方案,例如基于光流,尽管我认为两个视图还不够。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 1970-01-01
    • 2021-10-18
    • 2020-10-16
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2023-03-21
    • 2018-10-12
    相关资源
    最近更新 更多