我正在構建一個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;
}