2013-04-11 12 views
8

Voglio calcolare la distanza tra la fotocamera e l'oggetto riconosciuto.Per questo ho provato un sacco di metodi, ho cercato di trovare l'angolo tra l'oggetto e la fotocamera utilizzando accelerometro e quindi utilizzarecome possiamo misurare la distanza tra oggetto e telefono cellulare Android

d = h * abbronzarsi un

h è l'altezza della dal dalla base generalmente che è 1,4

e ho cercato di calcolare l'angolo utilizzando il metodo ottiene orientamento. Fammi sapere dove sto sbagliando. Sono stati più di 2 giorni che ho avuto difficoltà con questo requisito. Abbiamo esaminato varie applicazioni della fotocamera che sono disponibili su Android Store e abbiamo cercato di capire la funzionalità della stessa, ma nulla è stato fruttuoso.

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

Come sarebbe l'angolo in relazione alla distanza? Cosa succede se mi trovo su un balcone? Inoltre, come si può misurare la distanza se non si conoscono le dimensioni dell'oggetto catturato? Inoltre, quante informazioni sulla densità dell'obiettivo e del sensore ottico utilizzate? –

+0

Lo scopo dell'app è trovare la distanza tra un oggetto e la fotocamera. Supponendo che entrambi stiano sullo stesso terreno. Non stiamo provando a misurare la dimensione dell'oggetto. –

+0

Inoltre, si desidera consultare http://stackoverflow.com/q/4588485 –

risposta

5

Il tuo getRotationMatrix sta probabilmente restituendo false! Dovresti copiare i valori sui tuoi stessi vettori in modo che non vengano confusi! Usa il metodo clone() per farlo!

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
     gravity = event.values.clone(); 
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
     geoMagnetic = event.values.clone(); 

Utilizzando il codice più questo cambiamento sono stato in grado di ottenere i valori di azimut/passo/roll, senza che questo cambia il flag successo restituisce 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 

si dovrebbe usare il valore PITCH se stanno tenendo il telefono in modalità verticale, se stai tenendo il telefono in modalità orizzontale dovresti usare il valore ROLL.

Se si sta tenendo il telefono ad un'altezza 1.4 allora si avrà:

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

Si prega di notare che si dovrebbe usare radianti e non in gradi sulla funzione Math.tan.

Ho provato qui e i valori sembrano essere validi!

+0

provato, ma il problema esiste ancora. –

+0

Cos'è il PROBLEMA? Volevi sapere cosa stai facendo male e non stai ottenendo i valori correttamente. Ho usato lo stesso identico codice con solo i cambiamenti menzionati qui e sono stato in grado di ottenere i valori azimuth/pitch/roll ... – thiagolr

+0

Sto anche ottenendo i valori ma devo calcolare la distanza tra l'oggetto e la fotocamera usando il pitch (usando d = h * tan (a), dove d è la distanza h è l'altezza del sensore e a è l'angolo del passo).Ho cercato su Google e implementare questo metodo per ottenere la distanza. Ma la distanza calcolata usando questo passo dà il valore sbagliato. –

1

Il codice finale è

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); 
    } 
Problemi correlati