2013-04-11 61 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); 
    } 
相關問題