Segmentation Data Background

During the vizHOME project, objects were manually segmented for purposes of running different portions of the study. As a potential sample use case, this information could be used to test against automatic segmentation algorithms to determine "correctness" of the automatic segmentation.

Segmentation Data Format

The segmentation data is provided in a text file, where each line is a separate object within the home that has been segmented.

Each line of segmentation data is provided in the following format:

<name of object><single space><16 floating point numbers separated by 2 spaces>

The 16 floating point numbers represent a transformation that defines an oriented bounding box that surrounds a single object in the home. The identity matrix would represent a 1 meter x 1 meter x 1 meter box whose center point is 0,0,0 in 3D space.

Sample code for Parsing Segmentation Data

The following code provides an example in C# Unity3D for parsing and creating bounding boxes for each object in the segmentation data under a parent Unity game object:

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System;
using UnityEngine;

public class LoadBoundingBoxes : MonoBehaviour {

    public string fileName;
    public GameObject boundingBoxPrefab;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    [ContextMenu("LoadFile")]
    void LoadData()
    {
        if (fileName.Length > 0)
        {
            StreamReader reader = new StreamReader(fileName);
            string line;
            while ((line = reader.ReadLine()) != null)
            {
                string name;
                string[] ss = line.Split(
                        new[] { " " }, 
                        StringSplitOptions.RemoveEmptyEntries
                    );
                //Debug.Log(ss.Length);
                name = ss[0];
                Vector3 pos = new Vector3(
                         (float)double.Parse(ss[13]), 
                         (float)double.Parse(ss[15]), 
                        (float)-double.Parse(ss[14])
                    );
                GameObject bounds = Instantiate(
                        boundingBoxPrefab, 
                        pos, 
                        UnityEngine.Quaternion.identity, 
                        gameObject.transform
                    );
                Vector3 xScale = new Vector3(
                        (float)double.Parse(ss[1]), 
                        (float)double.Parse(ss[2]), 
                        (float)double.Parse(ss[3])
                    );
                Vector3 zScale = new Vector3(
                        (float)double.Parse(ss[5]), 
                        (float)double.Parse(ss[6]), 
                        (float)double.Parse(ss[7])
                    );
                Vector3 yScale = new Vector3(
                        (float)double.Parse(ss[9]), 
                        (float)double.Parse(ss[10]), 
                        (float)double.Parse(ss[11])
                    );
                bounds.transform.localScale = new Vector3(
                        xScale.magnitude, 
                        zScale.magnitude, 
                        yScale.magnitude
                    );

                Vector3 xA = xScale.normalized;
				Vector3 yA = yScale.normalized;
				Vector3 zA = zScale.normalized;
                Vector4 xAxis = new Vector4(xA.x, yA.x, zA.x, 0f);
                Vector4 yAxis = new Vector4(xA.y, yA.y, zA.y, 0f);
                Vector4 zAxis = new Vector4(xA.z, yA.z, zA.z, 0f);
                Vector4 wAxis = new Vector4(1f, 1f, 1f, 0f);
                Matrix4x4 m = new Matrix4x4(xAxis, yAxis, zAxis, wAxis);
                bounds.transform.rotation = m.rotation;
                bounds.name = name;
            }
        }
    }       
}