37 votes

comment obtenir la distance d'un objet à partir de la caméra de l'iPhone en utilisant les métadonnées Exif de l'image ?

J'ai vérifié un certain nombre de solutions mais aucune d'entre elles n'a été utile !

Je sais que la distance de travail = (hauteur du capteur + hauteur du sujet) * longueur focale / hauteur du capteur.

et

distance to object (mm) = focal length (mm) * real height of the object (mm) * image height (pixels)
                          ----------------------------------------------------------------
                                object height (pixels) * sensor height (mm)

Et je veux prendre de la distance par rapport à ça :

Formation de l'image par les lentilles et l'œil

Bonjour, j'obtiens les informations suivantes en utilisant l'image Exif ALAssetsLibrary

Et j'ai obtenu les méta-données suivantes :

Save image metadata.
 {
    DPIHeight = 72;
    DPIWidth = 72;
    FaceRegions =     {
        Regions =         {
            HeightAppliedTo = 2448;
            RegionList =             (
                                {
                    AngleInfoRoll = 270;
                    AngleInfoYaw = 0;
                    ConfidenceLevel = 376;
                    FaceID = 1;
                    Height = "0.1413399";
                    Timestamp = 5996166864910;
                    Type = Face;
                    Width = "0.1060049";
                    X = "0.3560049";
                    Y = "0.4746732";
                }
            );
            WidthAppliedTo = 3264;
        };
    };
    Orientation = 6;
    "{Exif}" =     {
        ApertureValue = "2.526068811667587";
        BrightnessValue = "1.291629806962232";
        ColorSpace = 1;
        DateTimeDigitized = "2014:03:25 15:43:36";
        DateTimeOriginal = "2014:03:25 15:43:36";
        ExposureMode = 0;
        ExposureProgram = 2;
        ExposureTime = "0.05";
        FNumber = "2.4";
        Flash = 24;
        FocalLenIn35mmFilm = 33;
        FocalLength = "4.12";
        ISOSpeedRatings =         (
            160
        );
        LensMake = Apple;
        LensModel = "iPhone 5 back camera 4.12mm f/2.4";
        LensSpecification =         (
            "4.12",
            "4.12",
            "2.4",
            "2.4"
        );
        MeteringMode = 5;
        PixelXDimension = 3264;
        PixelYDimension = 2448;
        SceneType = 1;
        SensingMethod = 2;
        ShutterSpeedValue = "4.321956949076723";
        SubjectArea =         (
            1631,
            1223,
            1795,
            1077
        );
        SubsecTimeDigitized = 261;
        SubsecTimeOriginal = 261;
        UserComment = hoge;
        WhiteBalance = 0;
    };
    "{GPS}" =     {
        Altitude = "196.008";
        AltitudeRef = 0;
        DateStamp = "2014:03:25";
        Latitude = "28.61772";
        LatitudeRef = N;
        Longitude = "77.38891";
        LongitudeRef = E;
        TimeStamp = "10:13:37.439000";
    };
    "{MakerApple}" =     {
        1 = 0;
        3 =         {
            epoch = 0;
            flags = 1;
            timescale = 1000000000;
            value = 249840592070541;
        };
        4 = 0;
        5 = 179;
        6 = 139;
        7 = 1;
    };
    "{TIFF}" =     {
        DateTime = "2014:03:25 15:43:36";
        Make = Apple;
        Model = "iPhone 5";
        Software = "7.0.6";
        XResolution = 72;
        YResolution = 72;
    };
}

J'ai besoin de calculer la distance de l'objet par rapport à la caméra, en utilisant les détails ci-dessus ; en utilisant un iphone4s,iphone5, ou iphone5s. Est-ce possible ?

enter image description here

Modifié Besoin de connaître la formule utilisée par cette application, une idée ?

Besoin de connaître une méthode

http://www.youtube.com/watch?v=eCStIagorx8

Comment fonctionne cette application ? Toute aide est la bienvenue

14voto

StuReeks Points 153

@iphonemaclover. Comme de nombreuses personnes l'ont souligné, il n'y a pas assez d'informations pour calculer cela en utilisant uniquement la trigonométrie. Cependant, en fonction de la précision dont vous avez besoin, ou de ce que vous essayez de mesurer et des autres données que vous pouvez espérer récupérer d'un iphone et/ou si vous êtes prêt à faire quelques hypothèses, il est possible de faire quelques avancées.

a) +1 à Martin R, si vous supposez une terre plate, une hauteur de téléphone (qui, selon l'application que vous avez citée) qu'un utilisateur peut mettre à jour à des fins de calibrage, peut récupérer des informations sur le terrain et savoir où se trouve un point sur le sol à la base de votre objet, alors c'est de la trigonométrie simple. Une fois la distance estimée et en supposant que l'objet que vous mesurez est proche de la verticale (ou se trouve à un angle connu), sa hauteur peut également être calculée.

b) Votre fichier exif contient des informations sur la région du visage. Si vous vous intéressez aux personnes et que vous êtes prêt à supposer qu'il s'agit d'un adulte, vous pouvez utiliser une hypothèse de taille de tête moyenne pour estimer la distance en utilisant la méthode que vous avez déjà décrite.

c) Si vous pouvez récupérer une série d'images et de positions de caméra et que les positions de la caméra et de l'objet varient, je pense que l'information 3D peut être récupérée en utilisant la géométrie projective.

9voto

colorado777 Points 49

Si vous vous demandez comment trouver la distance à partir de la hauteur du téléphone/tablette et de l'inclinaison vers le haut/bas, il suffit d'utiliser l'atan de l'angle vers le bas (0 s'il est dirigé vers l'avant ; -30 s'il est à -30 degrés vers le bas) multiplié par la hauteur.

Je sais que vous voulez utiliser la mise au point de l'appareil photo, mais c'est improbable. Vous avez mentionné une application Android, mais si vous remarquez que cette application vous demande d'entrer la hauteur du téléphone par rapport au sol. Vous pourriez essayer d'utiliser l'altitude du GPS moins ce que dit une carte topographique, mais c'est incroyablement imprécis. Vous pourriez aussi prendre une photo d'un endroit donné, puis vous déplacer autour de la cible de 45 degrés environ, mais tout le monde ne dispose pas d'une boussole pour mesurer cette distance ou n'a pas la possibilité de tourner en rond autour de la cible. Comment voulez-vous vous déplacer de 45 degrés autour d'un objet situé devant vous alors que vous êtes sur un pont ? Même si vous avez essayé d'utiliser la mise au point de la caméra, celle-ci est automatiquement mise à jour et je ne sais pas comment utiliser une variable pour trouver la mise au point de la caméra. https://developer.apple.com/library/ios/documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html montre comment régler le mode de mise au point, mais je ne trouve rien sur le réglage d'une mise au point personnalisée ou sur l'affichage de ce sur quoi l'appareil photo fait la mise au point. Si vous voulez prendre une photo et faire une sorte d'analyse personnalisée pixel par pixel pour voir comment elle est mise au point, allez-y. Peut-être qu'un iPhone jailbreaké peut accéder à la mise au point de l'appareil photo, mais je suppose que votre public cible est plus que le groupe restreint qui a passé par le processus de jailbreak.

Je pense que le moyen le plus simple de trouver la taille est de leur demander de pointer leur téléphone vers leur pied. Ensuite, vous pouvez leur demander la pointure et la marque de leur chaussure pour estimer la largeur de leur chaussure, ou simplement faire une estimation. Demandez-lui de pointer le côté de sa chaussure, éventuellement en affichant un point rouge au milieu de l'écran pour qu'il sache exactement où il pointe. Ensuite, demandez-lui de pointer l'autre côté et, une fois que vous avez capturé les deux bords de sa chaussure, utilisez la largeur estimée en pouces de sa chaussure multipliée par le tan de la différence d'angle d'un bord à l'autre (donc si elle est de 170 degrés lorsqu'elle pointe vers un bord et de 190 lorsqu'elle pointe vers l'autre, utilisez le tan de 20). Cela devrait vous donner la hauteur en pouces à partir du sol.

    s = shoe width;
    ao = angle when pointed at left shoe edge (y-axis)(radians);
    at = angle when pointed at right shoe edge (y-axis)(radians);
    a = angle of device when pointed at the point on the ground (x-axis)(radians);
    d = distance;
    d = atan(a) * tan(at - ao) * s;

5voto

SVMRAJESH Points 1685

Il n'est pas possible d'obtenir la distance en variant distance sol-mobile dynamiquement de chaque personne. L'utilisateur doit manuellement définir la hauteur du mobile à chaque fois qu'il effectue un calcul.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X