2017-01-02 81 views
0

我正在構建一個android應用程序,它應該在相機圖片上顯示gps座標的位置作爲點在畫布上,但我在計算2d點時遇到問題(在手機屏幕上)可以看到gps座標。Android SensorManager.getRotationMatrix產生錯誤的值

據我所知,投影是將攝像機矩陣乘以應該投影的點。相機矩陣可以通過乘以固有矩陣(我用這個問題的選擇答案計算焦距:Converting Focal Length in millimeters to pixels - Android;我的手機的屏幕分辨率是1920x1080,540 = 1080/2,960 = 1920/2)

/ 935 0 540 \ 
| 0 935 960 | 
\ 0 0 1/

與外在矩陣(這本質上是旋轉矩陣,因爲我把相機設置在原點0 | 0 | 0)。

我已經計算出攝像頭與gps座標(東北向上座標)的相對位置,它是13 | -4 | 2。


要檢查它的工作,我旋轉手機這樣的位置(我把一盞燈有)可以在屏幕的左上角可以看到,並寫下了旋轉矩陣。然後我重複這個過程,右上,右下,左下和中心。該旋轉矩陣爲:

Upper left: 
    -0.17288628 0.77568847 -0.6069743 
    0.19706762 0.6310352 0.75030595 
    0.9650258 0.010102619 -0.2619604 

Upper right: 
    0.16115496 0.65267444 -0.7403008 
    -0.13548408 0.75763404 0.6384627 
    0.9775853 -0.0025924728 0.21052347 

Lower right: 
    0.18777268 -0.31702965 -0.9296416 
    0.04068178 0.9481752 -0.31513295 
    0.9813697 0.021353884 0.19093873 

Lower left: 
    -0.25916395 -0.19289172 -0.94637567 
    -0.033540796 0.9810605 -0.19077612 
    0.96525085 -0.017700095 -0.26072523 

Center: 
    -0.003970425 0.33063367 -0.94375074 
    -0.011958062 0.94367504 0.33065745 
    0.99992067 0.01259828 0.000206947 

投影座標(13 | -4 | 2)使用旋轉矩陣上面給了我這些座標:

Upper left: 27 | 1069 
Upper right: 397 | 698 
Lower right: 682 | 673 
Lower left: 203 | 586 
Center:  308 | 711 

這是沒有意義的多種原因。一個例子是右上角和左下角不應該有(大致)相同的Y座標。 Point(13 | -4 | 2)是正確的,因此我猜想旋轉矩陣是錯誤的或者我錯誤地解釋了它們。

任何幫助表示讚賞!提前致謝。


我檢索到的旋轉矩陣用下面的代碼:

private SensorManager sensorManager; 
private Sensor accelerometer; 
private Sensor magnetometer; 
private float[] gravityValues = new float[3]; 
private float[] geomagneticValues = new float[3]; 
private float[] rotationMatrix = new float[16]; 

/* constructor */ { 
    sensorManager = (SensorManager) activity.getSystemService(SENSOR_SERVICE); 
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    magnetometer = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 

    sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
    sensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
public void onSensorChanged(SensorEvent event) { 
    switch (event.sensor.getType()) { 
     case Sensor.TYPE_ACCELEROMETER: 
      gravityValues = Arrays.copyOf(event.values, event.values.length); 
      break; 
     case Sensor.TYPE_MAGNETIC_FIELD: 
      geomagneticValues = Arrays.copyOf(event.values, event.values.length); 
     default: 
      break; 
    } 

    SensorManager.getRotationMatrix(rotationMatrix, null, gravityValues, geomagneticValues); 
} 

public float[] getRotationMatrix() { 
    return rotationMatrix; 
} 

https://developer.android.com/reference/android/hardware/SensorManager.html#getRotationMatrix(float[],%20float[],%20float[],%20float[])

回答