2013-04-11 11 views
8

カメラと認識されたオブジェクトの距離を計算したいのですが、これは多くの方法を試してみました。オブジェクトとカメラの間の角度加速度計、次いで*どうすればオブジェクトとアンドロイド携帯電話の距離を測定できますか

時間日焼け

のD = hを使用するが1.4

あり、iは、get配向法を用いて角度を算出しようと一般に基部からからの高さです。親切に私が間違っていることを教えてください。その2日以上が経過して私はこの要件に苦しんでいます。私たちは、Android Storeで利用可能なさまざまなカメラアプリケーションを検討し、同じ機能を理解しようとしましたが、何も効果がありませんでした。

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

のですか?私がバルコニーの上に立ったら?また、キャプチャされたオブジェクトのサイズがわからない場合、どのように距離を測定することができますか?さらに、どのくらいのレンズと光学センサーの密度情報を使用していますか? –

+0

アプリの目的は、オブジェクトとカメラの距離を見つけることです。両者が同じ地面に立っていると仮定します。私たちはオブジェクトのサイズを測定しようとしていません。 –

+0

また、http://stackoverflow.com/q/4588485 –

答えて

5

getRotationMatrixはおそらくfalseを返しています。あなたはそれらが混ざらないようにあなた自身のベクトルに値をコピーするべきです!クローン()メソッドを使用してください!

あなたのコードに加えて、この変更を使用して
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 

ます場合は、PITCH値を使用する必要があります電話機をポートレートモードにしておきます。電話機を横長モードにしている場合は、ROLL値を使用する必要があります。あなたは1.4の高さで携帯電話を持っている場合は

、あなたが持っているでしょう:

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

をあなたはMath.tan関数にRADIANSなくDEGREESを使用する必要があることに注意してください。

ここでテストしたところ、値は有効であるようです。

+0

これを試しましたが、依然として問題が存在します。 –

+0

問題は何ですか?あなたはあなたが間違っていることを知りたがっていて、値を正しく取得していません。私はここで言及された変更だけで正確に同じコードを使用し、私は方位角/ピッチ/ロールの値を得ることができました... – thiagolr

+0

私も値を取得していますが、私はオブジェクトとカメラ間の距離を計算する必要があります(d = h * tan(a)を用いて、dは距離hをセンサ高さ、aをピッチ角とする)。私はGoogle上で検索し、距離を得るこの方法を実装しています。しかし、このピッチを使って計算された距離は、間違った値を与えます。 –

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); 
    } 
関連する問題