2016-01-02 3 views
0

Ptoject Tango предоставляет облако точек, как вы можете получить позицию в пикселях трехмерной точки в облаке точек в метрах?Проецирование Tango 3D на экран Google Project Tango

Я попытался использовать матрицу проекции, но получаю очень маленькие значения (0,5,1,3 и т. Д.) Вместо 1234,324 (в пикселях).

Я включил код я попытался

//Get the current rotation matrix 
    Matrix4 projMatrix = mRenderer.getCurrentCamera().getProjectionMatrix(); 



    //Get all the points in the pointcloud and store them as 3D points 
    FloatBuffer pointsBuffer = mPointCloudManager.updateAndGetLatestPointCloudRenderBuffer().floatBuffer; 
    Vector3[] points3D = new Vector3[pointsBuffer.capacity()/3]; 

    int j =0; 
    for (int i = 0; i < pointsBuffer.capacity() - 3; i = i + 3) { 

     points3D[j]= new Vector3(
       pointsBuffer.get(i), 
       pointsBuffer.get(i+1), 
       pointsBuffer.get(i+2)); 
     //Log.v("Points3d", "J: "+ j + " X: " +points3D[j].x + "\tY: "+ points3D[j].y +"\tZ: "+ points3D[j].z); 
     j++; 
    } 


    //Get the projection of the points in the screen. 
    Vector3[] points2D = new Vector3[points3D.length]; 
    for(int i =0; i < points3D.length-1;i++) 
    { 
     Log.v("Points", "X: " +points3D[i].x + "\tY: "+ points3D[i].y +"\tZ: "+ points3D[i].z); 
     points2D[i] = points3D[i].multiply(projMatrix); 
     Log.v("Points", "pX: " +points2D[i].x + "\tpY: "+ points2D[i].y +"\tpZ: "+ points2D[i].z); 
    } 

Пример я использую помутнения Java, которую можно найти здесь https://github.com/googlesamples/tango-examples-java


UPDATE

TangoCameraIntrinsics ccIntrinsics = mTango.getCameraIntrinsics(TangoCameraIntrinsics.TANGO_CAMERA_COLOR); 
    double fx = ccIntrinsics.fx; 
    double fy = ccIntrinsics.fy; 
    double cx = ccIntrinsics.cx; 
    double cy = ccIntrinsics.cy; 

    double[][] projMatrix = new double[][] { 
      {fx, 0 , -cx}, 
      {0, fy, -cy}, 
      {0, 0, 1} 
    }; 

Затем, чтобы вычислить проецируемую точку, я использую

for(int i =0; i < points3D.length-1;i++) 
    { 

     double[][] point = new double[][] { 
       {points3D[i].x}, 
       {points3D[i].y}, 
       {points3D[i].z} 
     }; 

     double [][] point2d = CustomMatrix.multiplyByMatrix(projMatrix, point); 

     points2D[i] = new Vector2(0,0); 
     if(point2d[2][0]!=0) 
     { 
      Log.v("temp point", "pX: " +point2d[0][0]/point2d[2][0]+" pY: " +point2d[1][0]/point2d[2][0]); 
      points2D[i] = new Vector2(point2d[0][0]/point2d[2][0],point2d[1][0]/point2d[2][0]); 
     } 

    } 

Но я думаю, что результаты все еще не то, что, как ожидается, я, например, получить результаты, как:

рХ: -175.58042313027244 Py: -92.573740812066

Что для меня выглядит не так.


UPDATE Используя цветную камеру, как предложено, дают лучшие результаты, но poitns все еще негативен -1127,8086915171814 р: -652,5887102192332

Было бы хорошо, чтобы просто умножить их на -1?

+0

Использование + сх и + Cy для projMatrix – nbsrujan

ответ

2

Чтобы получить координату пикселя, необходимо умножить точку 3D на внутреннюю матрицу RGB-камеры. 3D-точки находятся в кадре Depthcamera. Вы получаете координаты пикселей по следующему методу:

и

х и у координаты пикселов. И K строится с параметрами, используя функцию intrinsics

+0

Спасибо, что имеет смысл, я попробую и дам вам знать, как она идет =) – Girauder

+0

@ Girauder Я скорректировал последнюю Матрицу, выхожу – nbsrujan

+0

Эй, я смотрю [link] (https://developers.google.com/project-tango/apis/java/reference/TangoCameraIntrinsics), в котором говорится о том, что вы говоря, но я не могу получить встроенные функции камеры, так как мне нужна камера, на которой у меня нет = S, не могли бы вы узнать, как их получить? – Girauder

Смежные вопросы