关于给定相机,GameObject的可视部分的边界框

时间:2019-05-09 09:35:07

标签: c# unity3d computer-vision bounding-box

我想在Unity3D中找到游戏对象可见部分的2D边界框(BB)。**

由于没有名声,所以我无法发布图片,所以这里有Imgur的链接:

起点: Image
显示初始场景摄像机。例如,我想获得过往车辆车轮的BB。

目标Image
我想以有效的方式显示相当小的BB。使用的方法非常昂贵,我想避免使用它。它适用于输入图片的分段版本,看起来类似于:Image

当前方法: Image
这将使用标记为滚轮的所有GameObjects(GO)的边界,并调用类似以下的函数:

Rect GetBoundingBox(GameObject go, Camera camera, float margin = 0f)
{
    Rect rect = new Rect(-1f, -1f, -1f, -1f);
    Vector3[] v; // Vertices

    // Object is behind camera
    if (camera.WorldToScreenPoint(go.GetComponentInChildren<Renderer>().bounds.center).z < 0)
        return rect;

    // get first mesh filter
    v = go.GetComponentInChildren<MeshFilter>().mesh.vertices;

    // maybe the game object hast no mesh yet... and is empty
    if (v.Length < 1 || v == null)
        return rect;

    for (int i = 0; i < v.Length; i++)
    {
        //World space
        v[i] = go.transform.TransformPoint(v[i]);
        //GUI space
        v[i] = camera.WorldToScreenPoint(v[i]);
        v[i].y = Screen.height - v[i].y;
    }

    Vector3 min = v[0];
    Vector3 max = v[0];

    for (int i = 1; i < v.Length; i++)
    {

        min = Vector3.Min(min, v[i]);
        max = Vector3.Max(max, v[i]);
    }

    //Construct a rect of the min and max positions and apply some margin
    rect = Rect.MinMaxRect(min.x, min.y, max.x, max.y);

    // apply optional margin
    rect.xMin -= margin;
    rect.xMax += margin;
    rect.yMin -= margin;
    rect.yMax += margin;

    return rect;
}

出现两个问题。

  1. 即使相机看不到GO,它也会获得所有BB。
  2. 即使它是可见的,边界也和GO本身一样大,而不是可见的部分。

我对每个正确方向的提示都很满意!

对于有兴趣的人,背景是开发用于生成/模拟深度学习项目的带标签的训练数据的应用程序。

0 个答案:

没有答案