简体   繁体   English

我们如何测量对象和Android手机摄像头之间的距离

[英]how can we measure distance between object and android phone camera

I want to calculate the distance between the camera and the recognized object.For this I tried a lot of methods, I tried to find the angle between the object and the camera using accelerometer and then use 我想计算相机和识别物体之间的距离。为此我尝试了很多方法,我试图用加速度计找到物体和相机之间的角度,然后使用

d = h * tan a d = h * tan a

h is height of from from the base generally which is 1.4 h是距离基部的高度,通常为1.4

and i tried to calculate the angle by using get orientation method. 我尝试使用get orientation方法计算角度。 Kindly let me know where am I doing wrong. 请告诉我在哪里做错了。 Its been more than 2 days I have been struggling with this requirement. 已经超过2天,我一直在努力满足这一要求。 We have looked into various Camera applications which are available on Android Store and have tried to understand the functionality of the same but nothing has been fruitful. 我们已经研究了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);
    }

Your getRotationMatrix is probably returning false! 你的getRotationMatrix可能会返回false! You should copy the values to your own vectors so they don't get mixed up! 您应该将值复制到您自己的向量中,这样它们就不会混淆! Use the clone() method to do so! 使用clone()方法执行此操作!

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

Using your code plus this change I was able to get the azimuth/pitch/roll values, without this change the success flag returns false: 使用你的代码加上这个改变,我得到了方位角/俯仰/滚动值,没有这个改变,成功标志返回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

You should use the PITCH value if you are holding the phone in portrait mode, if you are holding the phone in landscape mode you should use the ROLL value. 如果您以纵向模式握住手机,则应使用PITCH值;如果您以横向模式握住手机,则应使用ROLL值。

If you are holding the phone at a 1.4 height then you will have: 如果您将手机保持在1.4高度,那么您将拥有:

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

Please note that you should use RADIANS and not DEGREES on the Math.tan function. 请注意,您应该在Math.tan函数上使用RADIANS而不是DEGREES。

I tested here and the values seem to be valid! 我在这里测试过,值似乎是有效的!

The final code is 最终的代码是

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何测量手机与被拍object之间的距离? - How to measure distance between mobile phone and the object being photographed? 如何使用相机测量物体的距离? - How to measure distance of object using camera? 如何测量物体或面部与相机的距离 - How to measure distance of an object or face from camera 是否可以用相机测量到物体的距离? - Is it possible to measure distance to object with camera? Android - 测量与相机的距离 - Android - Measure distance from camera 我们如何在android中的两个应用程序之间共享一个摄像头? - How can we share one camera between two application in android? 如何在ArcGIS for Android中测量pointGraphicOverlay与曲折线GraphicOverlay之间的最小距离? - How can I measure the minimum distance between a pointGraphicOverlay to a tortuous lineGraphicOverlay in ArcGIS for Android? 如何获取 object 与相机 android 的距离? - how to get object distance from camera android? 如何测量像 iBeacon 一样的 iPhone 和 Android 设备之间的距离 - How to measure the distance between an iPhone acting like an iBeacon and an Android device 如何测量屏幕上两点之间的物理距离(Android)? - How to measure the physical distance between two points on a screen (Android)?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM