public void SaveCubeCorner(List <Quad> rects)
    {
        m_renderEngine.ClearAll();
        if (rects == null)
        {
            Debug.Log("Error: The cube data is not right!"); return;
        }

        StreamWriter sw = new StreamWriter(m_fs);

        Vector2[] corners = rects.Count > 1 ? new Vector2[8] : new Vector2[4];
        Array.Copy(m_projector.Proj3dToImage(rects[0].CornerPoints3d).ToArray(), 0, corners, 0, 4);
        if (rects.Count > 1)
        {
            Array.Copy(m_projector.Proj3dToImage(rects[rects.Count - 1].CornerPoints3d).ToArray(), 0, corners, 4, 4);
        }
        // Re-scale
        for (int i = 0; i < corners.Length; i++)
        {
            m_renderEngine.DrawPoint(corners[i], UnityEngine.Color.red);
            corners[i].x = corners[i].x / m_Img.width * m_OrigImg.Width;
            corners[i].y = corners[i].y / m_Img.height * m_OrigImg.Height;
            sw.WriteLine(corners[i].x + " " + corners[i].y);
        }

        sw.Flush();
    }