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. The types of objects that were segmented include:
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;
            }
        }
    }       
}
                


