2013-04-11 277 views
8

我想计算相机和识别物体之间的距离。为此我尝试了很多方法,试图找到物体和相机之间的角度加速度计,然后使用我们如何测量物体和android手机相机之间的距离

d = H *晒黑一个

h是从基通常是1.4

的高度和我试图通过使用得到取向的方法来计算的角度。请让我知道我在哪里做错了。已经有两天多的时间了,我一直在努力满足这个要求。我们研究了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); 
    } 
+1

怎样的角度涉及到的距离?如果我站在阳台上怎么办?另外,如果您不知道被捕获物体的尺寸,怎么能测量距离?另外,您使用多少镜头和光学传感器密度信息? – 2013-04-11 13:26:12

+0

该应用程序的目的是找到对象和相机之间的距离。假设两者都站在同一个地面上。我们不是在测量物体的大小。 – 2013-04-11 13:33:40

+0

此外,你想看看http://stackoverflow.com/q/4588485 – 2013-04-11 13:35:37

回答

5

您的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(); 

使用你的代码加上这个变化我能得到的方位/俯仰/滚动值,如果没有这种改变的成功标志返回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 

你应该,如果你使用的音高值。正在以纵向模式握住手机,如果您以横向模式握住手机,则应使用ROLL值。

如果你拿着手机在一个1.4的高度,那么你将有:

float dist = Math.abs((float) (1.4f * Math.tan(pitch * Math.PI/180))); 

请注意,您应在Math.tan功能使用弧度和不度。

我在这里测试和值似乎是有效的!

+0

尝试过,但仍存在问题。 – 2013-05-21 15:00:55

+0

什么是问题?你想知道你做错了什么,并且你没有正确地获取这些值。我使用了完全相同的代码,只是在这里提到的改变,我能够得到方位角/俯仰角/侧倾角值... – thiagolr 2013-05-21 16:11:02

+0

我也越来越值,但我必须计算物体和相机之间的距离(通过使用d = h * tan(a),其中d是距离h是传感器高度并且a是俯仰角)。我搜索了谷歌并实现了获取距离的这种方法。但是通过使用这个间距计算的距离给出了错误的值。 – 2013-05-22 06:17:19

1

最后的代码是

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 

       float d = Math.abs((float) (1.4f * Math.tan(pitch * Math.PI/180))); 
       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); 
    } 
相关问题