我使用MATLAB的相机校准器应用程序使用棋盘校准了一台单声道相机。从这个我得到所有的相机参数保存在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);发布于 2018-01-29 03:23:38
你的问题没有准确地描述相机/物体运动的类型,所以我只是假设相机的移动足以让我们有一个基线(以估计深度)。然后,我们首先假设对象是静态的。在这种情况下,我建议你首先尝试更经典的方法:首先计算你拍摄的两个瞬间之间的相对运动,即两个相机之间的相对运动。如果您的特征匹配正确,则可以通过计算基本矩阵轻松完成(请参阅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因此,这为您提供了一种估计对象位置/方向变化的方法。但它可能不是一个健壮的解决方案,只能在非常简单的情况下工作。
如果对象不是静态的,那么它的特征将是相对于您计算的基本要素的异常值,因此它们不会被三角化。这个问题相当困难,但我怀疑可能会有解决方案,例如基于光流,尽管我不认为两个视图将是足够的。
我希望这能有所帮助。
https://stackoverflow.com/questions/48488726
复制相似问题