matlab 是否有可能使用立体图像(或任何其他方法)找出物体内点的深度?

o4tp2gmn  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(132)

我有一个机器人的图像,上面有黄色记号笔,如图所示

显示的黄点是标记。有两个摄像头用于查看偏移量为90度的图像。机器人在摄像机之间弯下腰来。该装置的简图可供参考。
https://i.stack.imgur.com/aVyDq.png
使用这两个摄像头,我能够获得黄色标记的3D坐标。但是,我需要找到机器人中心点的3D坐标,如图所示。

我需要找到红色标记点的3D位置,这是圆柱形机器人内部。首先,这是否可行?如果是,我可以用什么方法来实现这一点?另外,有没有什么文献可以找到这样的内部点的3D位置,我可以参考(我搜索了,但找不到任何与我的要求类似的东西)。
我也欢迎理论上的解决方案(只要它确保在合理的错误中找到中心点),我可以稍后将其转换为代码。

lrpiutwd

lrpiutwd1#

如果你知道白色条纹的实际尺寸,或者至少是形状(例如完美的圆圈),那么是的,这是可行的和可能的。
您需要执行以下步骤,这些步骤并不容易,我在此不再赘述:
1.可选,但极力建议:校准摄像头,并且不失真。
1.对于任意给定的旋转,求出3D圆到2D相机的投影方程。您可以通过假设白线将完全水平来简化此操作。你想要一些函数,它接受构成圆和旋转的参数。
1.找出图像中所有的白色条带,对其进行分割,并使其水平(旋转)
1.将修正后的白色圆圈中的点与(1)中的方程式进行拟合。这应该会给出圆在3D中的参数(半径,Angular ),如果你写对了等式的话。
1.现在您有了实际圆的解析方程(从1开始的方程,参数从3开始),您可以将来自该圆的任何点(例如,它的中心)Map到图像位置。记住在步骤2中取消对旋转的更正。
这需要对曲线拟合的理解,一些几何分析数学,以及良好的编程技能。这不是微不足道的,但这将提供一个高度准确的解决方案。
对于不准确的解决方案:
1.找到白色圆圈的终点
1.制作连接端点的线
1.选择中心点作为这条线的中点。
这将是不准确的,因为:选择终点的误差比用所有点拟合方程的误差更大,忽略摄影机视图的圆锥体形状,忽略几何体。
但对于你想要的,它可能已经足够好了。

azpvetkf

azpvetkf2#

我已经能够通过将椭圆拟合到相机可见的圆弧来提取中点。椭圆的质心是所需的中点。

也会有错误的省略,可以忽略。提取椭圆的步骤如下:

  • 提取标记
  • 两面化和简单化
  • 将椭圆适配到圆弧上(找到了一个用于此的MatLab函数)
  • 获取椭圆的质心
hsv_img=rgb2hsv(im);
bin=new_hsv_img(:,:,3)>marker_th; %was chosen 0.35

%skeletonise
skel=bwskel(bin);

%use regionprops to get the pixelID list
stats=regionprops(skel,'all');
for i=1:numel(stats)
    el = fit_ellipse(stats(i).PixelList(:,1),stats(i).PixelList(:,2));
    ellipse_draw(el.a, el.b, -el.phi, el.X0_in, el.Y0_in, 'g');

相关问题