2013-04-11 35 views
8

Kamera ile tanınan nesne arasındaki mesafeyi hesaplamak istiyorum. Bunun için birçok yöntem denedim, nesne ve kamera arasındaki açıyı bulmaya çalıştım. ivme ölçer ve daha sonra * birNesne ile android telefon arasındaki mesafeyi nasıl ölçebiliriz?

h tan

= H kullanmak 1.4

, genellikle tabanından gelen yüksekliği ve i yönlendirme yöntemi elde kullanılarak açısını hesaplamak için çalışılmıştır. Lütfen yanlış nerede olduğumu bana bildirin. Bu şartla mücadele ettiğim 2 günden fazla oldu. Android Store'da bulunan ve aynı şeyin işlevini anlamaya çalışan çeşitli Kamera uygulamalarını inceledik ancak hiçbir şey verimli olmadı.

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

mı? Ya balkonda durursam? Ayrıca, yakalanan nesnenin boyutlarını bilmiyorsanız, mesafeyi nasıl ölçebilirsiniz? Ayrıca, ne kadar objektif ve optik sensör yoğunluk bilgisi kullanıyorsunuz? –

+0

Uygulamanın amacı, bir nesne ile kamera arasındaki mesafeyi bulmaktır. Her ikisinin de aynı yerde durduğunu varsayalım. Nesnenin boyutunu ölçmeye çalışmıyoruz. –

+0

Ayrıca, http://stackoverflow.com/q/4588485 –

cevap

5

getRotationMatrix'iniz muhtemelen yanlış döndürüyor! Değerleri kendi vektörlerinize kopyalamalısınız, böylece karıştırılmıyorlar! Bunu yapmak için clone() yöntemini kullanın! Bu başarı bayrağını değiştirmek olmadan kodunuzu artı azimut/eğim/dönüş değerleri elde edebildi bu değişikliği kullanma

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

false döndürür:

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 

Sen eğer PITCH değerini kullanmalıdır telefonu dikey modda tutuyorsanız, telefonu yatay modda tutuyorsanız, ROLL değerini kullanmalısınız. Eğer bir 1.4 yükseklikte telefonu tuttuğunuz takdirde

o zaman sahip olacaktır:

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

Eğer Math.tan işlevini RADIANS değil DERECE kullanması gerektiğini unutmayınız.

Burada test ettim ve değerler geçerli görünüyor!

+0

bunu denedi ancak hala sorun var. –

+0

SORUN Nedir? Ne yaptığınızı bilmek istediniz ve doğru değerleri almıyorsunuz. Aynı kodu sadece burada değinilen değişiklikle kullandım ve azimut/pitch/roll değerlerini elde edebildim ... – thiagolr

+0

Değerleri de alıyorum ama nesne ile kamera arasındaki mesafeyi hesaplamak zorundayım. pitch (d = h * tan (a) kullanarak, burada d mesafesi h'dir sensör yüksekliği ve a eğim açısıdır).Google üzerinden arama yaptım ve mesafeyi alma yöntemini uygularım. Ancak bu değer kullanılarak hesaplanan mesafe yanlış değer veriyor. –

1

son kod açısı mesafesi ne ölçüde ilişkili olduğunu nasıl

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