【问题标题】:Stereo vision: Coresponding coordinates立体视觉:对应坐标
【发布时间】:2013-12-23 17:14:12
【问题描述】:

请您帮我理解 Matlab Help 中关于 Stereo vision - Basic Block Matching 的代码?

% Scan over all rows.
for m=1:nRowsLeft
    % Set min/max row bounds for image block.
    minr = max(1,m-halfBlockSize);
    maxr = min(nRowsLeft,m+halfBlockSize);
    % Scan over all columns.
    for n=1:size(leftI,2)
        minc = max(1,n-halfBlockSize);
        maxc = min(size(leftI,2),n+halfBlockSize);
        % Compute disparity bounds.
        mind = max( -disparityRange, 1-minc );
        maxd = min( disparityRange, size(leftI,2)-maxc );

        % Construct template and region of interest.
        template = rightI(minr:maxr,minc:maxc);
        templateCenter = floor((size(template)+1)/2);
        roi = [minc+templateCenter(2)+mind-1 ...
               minr+templateCenter(1)-1 ...
               maxd-mind+1 1];
        % Lookup proper TemplateMatcher object; create if empty.
        if isempty(tmats{size(template,1),size(template,2)})
            tmats{size(template,1),size(template,2)} = ...
                vision.TemplateMatcher('ROIInputPort',true);
        end
        thisTemplateMatcher = tmats{size(template,1),size(template,2)};

        % Run TemplateMatcher object.
        loc = step(thisTemplateMatcher, leftI, template, roi);
        Dbasic(m,n) = loc(1) - roi(1) + mind;
    end
    waitbar(m/nRowsLeft,hWaitBar);
end

根据Matlab帮助:loc包含左图中点的位置坐标,roi包含右图中x和y所在区域的[x y width height]是左上角的坐标。

我想知道左右图像中对应的坐标。左图:x = loc(1)y = loc(2) 右图:x = roi(1) - mind, y = loc(2)

这是正确的吗?我不确定 roi 里面到底是什么。

【问题讨论】:

  • 如果我没记错的话,Dbasic 是一个网格,其中包含与特定迭代匹配的块的种子。
  • @AlexandreBizeau 根据这一步Dbasic(m,n) = loc(1) - roi(1) + mind; 在每次迭代期间,我假设Dbasic 包含视差图。基于此,loc(1) 应包含左侧图像中的列坐标和同一行右侧图像中的roi(1) - mind 列坐标。但我不确定。我用它来确定物体和立体视觉相机之间的距离,但结果并不像我想要的那样准确。所以我想知道这部分是否正确。
  • 我曾尝试使用该功能。和你一样,Matlab SGBM 结果不是那么好。我为此使用 Opencv Matlab 包装器,对我来说效果很好。但是是否有错误,或者您只是想了解他们在该功能中做了什么?
  • Matlab 提供了函数disparity()vipstereo_blockmatch_combined(),它们都返回一个视差图。但我只需要从左右图像中获取相应的坐标。为此,我已经转换了他们的块匹配函数并获得如下坐标:xL = loc(1), yL = loc(2), xR = roi(1) - mind, yR = loc(2) 在每次迭代中。没有错误,但我不确定它是否正确。感谢您分享您的经验,这非常节省时间。我想得到最准确的结果,所以我将专注于 OpenCV 包装器。
  • 好吧,你并不真正需要视差,而是两个图像之间的匹配点。通常,通过三角测量,您可以做到这一点。您需要相机信息(焦点、中心)和视差图来获取深度,您可以使用 X_left、X_right 和 X_scene 来完成。您从左点开始,使用视差图获取 3D 点并将其转换为右相机。不知道对你有没有好处。

标签: matlab matching stereo-3d matlab-cvst


【解决方案1】:

您应该能够改用计算机视觉系统工具箱中的 disparity 函数,该函数实现了块匹配算法。

如果您只需要匹配点,则应该使用局部特征:检测两个图像中的一些兴趣点,例如角点或斑点,从这些点周围的补丁中提取特征描述符,然后匹配描述符。这称为查找对应关系,这种方法的优点是您的图像不需要校正。

这是example of finding correspondences to estimate an affine transformation between a pair of images。这是example of finding correspondences for stereo rectification

【讨论】:

  • 感谢您的建议。我知道disparity(),但输出是视差图,我需要两个图像之间的匹配点。这是计算视差之前的步骤,位于disparity() 内。您有什么有效的方法获得它的建议吗?
  • 好的。并且有可能通过这个程序,获得左右图像中每个像素的坐标吗?请你看看我上面对 Alexandre Bizeau 的回复好吗?有一个描述我到底需要什么。
  • 现在我很困惑。如果你需要“密集”的对应关系,我。 e.对于右侧图像中的每个像素,您需要左侧图像中的相应像素,然后视差的输出会为您提供,因为它告诉您每个像素的 x 偏移。如果您的图像已得到纠正,则这些行已经对应。那么对于左图中的每个像素点,只要简单的加上对应的视差值,就可以得到右图中对应像素点的x坐标。
  • 你是绝对正确的。发布此问题后,我意识到了这个简单的解决方案。
猜你喜欢
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2013-05-23
相关资源
最近更新 更多