2016-07-06 4 views
1

Я пытаюсь создать карту глубины из облака точек. Я знаю, что я могу проецировать облако точек на плоскость изображения, однако в сценарии TangoSupport уже есть функция (ScreenCoordinateToWorldNearestNeighbor), которая находит точку XYZ, заданную координатой экрана.Создание карты глубины из облака точки

Я не могу заставить эту функцию поддержки работать, и кажется, что один или несколько моих входов недействительны. Я обновляю текстуру глубины в событии OnTangoDepthAvailable.

public void OnTangoDepthAvailable(TangoUnityDepth tangoDepth) 
{ 
    _depthAvailable = true; 
    Matrix4x4 ccWorld = _Camera.transform.localToWorldMatrix; 
    bool isValid = false; 
    Vector3 colorCameraPoint = new Vector3(); 
    for (int i = 0; i < _depthMapSize; i++) 
    { 
     for (int j = 0; j < _depthMapSize; j++) 
     { 
      if (TangoSupport.ScreenCoordinateToWorldNearestNeighbor(
       _PointCloud.m_points, _PointCloud.m_pointsCount, 
       tangoDepth.m_timestamp, 
       _ccIntrinsics, 
       ref ccWorld, 
       new Vector2(i/(float)_depthMapSize, j/(float)_depthMapSize), 
       out colorCameraPoint, out isValid) == Common.ErrorType.TANGO_INVALID) 
      { 
       _depthTexture.SetPixel(i, j, Color.red); 
       continue; 
      } 

      if (isValid) 
      { 
       //_depthTexture.SetPixel(i, j, new Color(colorCameraPoint.z, colorCameraPoint.z, colorCameraPoint.z)); 
       _depthTexture.SetPixel(i, j, 
        new Color(0,UnityEngine.Random.value,0)); 
      } 
      else 
      { 
       _depthTexture.SetPixel(i, j, Color.white); 
      } 
     } 
    } 
    _depthTexture.Apply(); 
    _DepthMapQuad.material.mainTexture = _depthTexture; 
} 

Если бы я должен был догадаться, я бы сказал, что я прохожу в неверном матрице (ccWorld). Вот что говорится в документах для матрицы пар:

Transformation матрица цветной камеры относительно единства мира кадра.

В результате получается белая карта глубины, что означает, что функция возвращается успешно, однако isValid является ложным, что означает, что он не может найти точку точки точки ближайшего пункта после проецирования.

Любые идеи? Также я заметил, что производительность довольно плохая, даже когда моя карта глубины 8x8. Не следует ли обновлять карту глубины, когда доступны новые данные глубины (внутри OnTangoDepthAvailable)?

Редактировать: Мне удалось вернуть функцию успешно, однако теперь она не находит точку точки точки рядом с проекцией. Полученная карта глубины всегда белая. Я распечатываю все аргументы, и все выглядит правильно, поэтому я думаю, что я перехожу в неправильную матрицу.

+0

Как вы получили Tango SDK для Unity3D? Сцена всех сцен разбивается для меня каждые 30 секунд или около того. Есть идеи? –

ответ

1

Вы должны обновить свой SDK и Project Tango Dev Kit. Вот пример получения карты глубины на Android, возможно, вы получите подсказку для единства:

public class MainActivity extends AppCompatActivity { 

    private Tango mTango; 
    private TangoConfig mTangoConfig; 
    private TangoPointCloudManager mPointCloudManager; 
    private AtomicBoolean tConnected = new AtomicBoolean(false); 
    Random rand = new Random(); 
    private ImageView imageDepthMap; 


    private static final ArrayList<TangoCoordinateFramePair> framePairs = new ArrayList<TangoCoordinateFramePair>(); 

    { 
     framePairs.add(new TangoCoordinateFramePair(
       TangoPoseData.COORDINATE_FRAME_CAMERA_DEPTH, 
       TangoPoseData.COORDINATE_FRAME_DEVICE)); 
    } 
     @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


      //initialize the imageView 
      imageDepthMap = (ImageView)findViewById(R.id.imageView); 

     //initialize pointCloudManager 

     mPointCloudManager = new TangoPointCloudManager(); 


    } 

    @Override 
    protected void onResume(){ 

     super.onResume(); 
     //obtain the tango configuration 

     if(tConnected.compareAndSet(false, true)) { 


      try { 

       setTango(); 

      } catch (TangoOutOfDateException tE) { 

       tE.printStackTrace(); 
      } 

     } 
    } 

    @Override 
    protected void onPause(){ 

     super.onPause(); 

     if(tConnected.compareAndSet(true, false)) { 
      try { 
       //disconnect Tango service so other applications can use it 
       mTango.disconnect(); 
      } catch (TangoException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 


    private void setTango(){ 

     mTango = new Tango(MainActivity.this, new Runnable() { 
      @Override 
      public void run() { 

       TangoSupport.initialize(); 
       mTangoConfig = new TangoConfig(); 
       mTangoConfig = mTango.getConfig(TangoConfig.CONFIG_TYPE_CURRENT); 
       mTangoConfig.putBoolean(TangoConfig.KEY_BOOLEAN_DEPTH, true); //activate depth sensing 

       mTango.connect(mTangoConfig); 

       mTango.connectListener(framePairs, new Tango.OnTangoUpdateListener() { 
       @Override 
       public void onPoseAvailable(TangoPoseData tangoPoseData) { 

       } 

       @Override 
       public void onXyzIjAvailable(TangoXyzIjData pointCloud) { 

        // Log.d("gDebug", "xyZAvailable"); 
        //TangoXyzIjData pointCloud = mPointCloudManager.getLatestXyzIj(); 
        // Update current camera pose 

        if (pointCloud.ijRows * pointCloud.ijCols > 0){ 
         try { 
          // Calculate the last camera color pose. 
          TangoPoseData lastFramePose = TangoSupport.getPoseAtTime(0, 
            TangoPoseData.COORDINATE_FRAME_START_OF_SERVICE, 
            TangoPoseData.COORDINATE_FRAME_CAMERA_COLOR, 
            TangoSupport.TANGO_SUPPORT_ENGINE_OPENGL, 0); 


          if (pointCloud != null) { 

           //obtain depth info per pixel 
           TangoSupport.DepthBuffer depthBuf = TangoSupport.upsampleImageNearestNeighbor(pointCloud, mTango.getCameraIntrinsics(TangoCameraIntrinsics.TANGO_CAMERA_COLOR), lastFramePose); 

           //create Depth map 
           int[] intBuff = convertToInt(depthBuf.depths, depthBuf.width, depthBuf.height);        

           final Bitmap Image = Bitmap.createBitmap(intBuff, depthBuf.width, depthBuf.height, Bitmap.Config.ARGB_8888); 

           runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 
             imageDepthMap.setImageBitmap(Image); 
            } 
           }); 

          } 
         } catch (TangoErrorException e) { 
          Log.e("gDebug", "Could not get valid transform"); 
         } 
       } 
      } 

      @Override 
      public void onFrameAvailable(int i) { 

       //Log.d("gDebug", "Frame Available from " + i); 
      } 

      @Override 
      public void onTangoEvent(TangoEvent tangoEvent) { 

      } 
     }); 
      } 
     }); 


    } 

    private int[] convertToInt(FloatBuffer pointCloudData, int width, int height){ 
     double mulFact = 255.0/5.0; 
     int byteArrayCapacity = width * height; 
     int[] depthMap = new int[byteArrayCapacity]; 
     int grayPixVal = 0; 

     pointCloudData.rewind(); 
     for(int i =0; i < byteArrayCapacity; i++){ 

      //obtain grayscale representation 
      grayPixVal = (int)(mulFact * (5.0- pointCloudData.get(i))); 
      depthMap[i] = Color.rgb(grayPixVal, grayPixVal, grayPixVal); 

     } 



     return depthMap; 
    } 

} 

Я извлек этот код из моей уже рабочей версии. Попробуйте исправить любые связанные с конфигурацией ошибки. Код предполагает диапазон измерения глубины глубины 0,4 м - 5 м. Отображение нуля до 255 позволяет областям, которые не были оценены (значение нуля), быть белым.

+0

Не существует класса глубины буфера или upsampleImageNearestNeighbor для единства sdk. Проецирование облака точек на изображение довольно медленно в единстве, поэтому я рассмотрю java sdk. – Infodayne

+0

Привет, я пробовал ваш код, но кажется, что TangoSupport.DepthBuffer в версии 1.55 больше не существует? Как создать новый – Ares91

+0

Привет, я не работал с проектным танго некоторое время. Фактически вы можете отправить электронное письмо в команду танго проекта по адресу [email protected] (они ответили на мой адрес в последний раз, когда я пробовал) или задают вопросы здесь: https://plus.google.com/communities/114537896428695886568. Однако кажется, что класс все еще существует: https://developers.google.com/tango/apis/java/support/reference/TangoSupport –