2013-04-11 5 views
8

Я хочу рассчитать расстояние между камерой и распознанным объектом. Для этого я пробовал много методов, я попытался найти угол между объектом и камерой, используя акселерометр, а затем использоватькак измерить расстояние между объектами и камерой телефона Android

г = Н * загару с

ч высота от от основания в целом, который составляет 1,4

и я попытался вычислить угол, используя метод получения ориентации. Пожалуйста, дайте мне знать, где я делаю неправильно. Его более двух дней я боролся с этим требованием. Мы рассмотрели различные приложения для камер, которые доступны в 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! Вы должны скопировать значения в свои собственные векторы, чтобы они не смешивались! Используйте метод clone() для этого!

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

Использование кода плюс это изменение, которое я смог получить значения азимута/высоты тона/рулон, без этого изменения флага успеха возвращает ложь:

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

попробовал это, но проблема все же существует. –

+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); 
    } 
Смежные вопросы