Rat*_*agi 10 camera android accelerometer android-sensors
我想计算相机和识别物体之间的距离.为此我尝试了很多方法,我试图用加速度计找到物体和相机之间的角度,然后使用
d = h*tan a
h是距离基部的高度,通常为1.4
我尝试使用get orientation方法计算角度.请告诉我在哪里做错了.已经超过2天,我一直在努力满足这一要求.我们已经研究了Android Store上可用的各种Camera应用程序,并尝试了解它们的功能,但没有任何成果.
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magnetSensor = mSensorManager
.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
gravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
geoMagnetic = event.values;
if (gravity != null && geoMagnetic != null) {
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, gravity,
geoMagnetic);
if (success) {
/* Orientation has azimuth, pitch and roll */
float orientation[] = new float[3];
//SensorManager.remapCoordinateSystem(R, 1, 3, orientation);
SensorManager.getOrientation(R, orientation);
azimut = 57.29578F * orientation[0];
pitch = 57.29578F * orientation[1];
roll = 57.29578F * orientation[2];
}
}
}
captureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// get an image from the camera
double d = (Math.tan(Math.toRadians(Math.abs(pitch))) * sensorHeight);
Toast.makeText(
getApplicationContext(),
"Distance = "
+ String.valueOf(d)
+ "m Angle = "
+ String.valueOf(Math.toRadians(Math.abs(pitch))),
Toast.LENGTH_LONG).show();
}
});
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, accSensor,
SensorManager.SENSOR_DELAY_NORMAL);
mSensorManager.registerListener(this, magnetSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
Run Code Online (Sandbox Code Playgroud)
你的getRotationMatrix可能会返回false!您应该将值复制到您自己的向量中,这样它们就不会混淆!使用clone()方法执行此操作!
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
gravity = event.values.clone();
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
geoMagnetic = event.values.clone();
Run Code Online (Sandbox Code Playgroud)
使用你的代码加上这个改变,我得到了方位角/俯仰/滚动值,没有这个改变,成功标志返回false:
Log.d("a", "orientation values: " + azimut + " / " + pitch + " / " + roll);
05-21 16:07:55.743: D/a(29429): orientation values: 77.71578 / 43.352722 / -152.39603
05-21 16:07:55.883: D/a(29429): orientation values: 175.26134 / 23.031355 / -148.72844
05-21 16:07:56.793: D/a(29429): orientation values: -146.3089 / 4.1098075 / -14.46417
Run Code Online (Sandbox Code Playgroud)
如果您以纵向模式握住手机,则应使用PITCH值;如果您以横向模式握住手机,则应使用ROLL值.
如果您将手机保持在1.4高度,那么您将拥有:
float dist = Math.abs((float) (1.4f * Math.tan(pitch * Math.PI / 180)));
Run Code Online (Sandbox Code Playgroud)
请注意,您应该在Math.tan函数上使用RADIANS而不是DEGREES.
我在这里测试过,值似乎是有效的!
| 归档时间: |
|
| 查看次数: |
13582 次 |
| 最近记录: |