Déterminer l'angle de vue de l'appareil photo du téléphone intelligent
Je suis en train de déterminer le degré de la taille du champ de vue d'un Droid Incredible smartphone appareil photo. J'ai besoin de savoir cette valeur pour une application que je suis en développement. Personne ne sait comment je peux trouver l'/calcul par programmation?
Vous devez vous connecter pour publier un commentaire.
Moins qu'il y a certains appels de l'API pour que (je ne suis pas un programmeur Android, je ne sais pas), je voudrais juste prendre une photo d'une règle à partir d'une distance, de voir comment une grande partie de la règle est montré dans l'image, puis utiliser la trigonométrie pour trouver l'angle comme cette:
maintenant, vous avez les deux distances l et d de la figure. Avec quelques simples goniométrie, on peut obtenir:
tan(α/2) = (l/2)/d,
donc
α = 2*atan(l/2d)
Donc, avec cette formule, vous pouvez calculer l'horizontale, le champ de vision de votre caméra. Bien sûr, la mesure de la verticale f.o.v. va exactement de la même façon, sauf que vous devez afficher l'objet dans sa position verticale.
Ensuite, vous pouvez coder en dur comme une constante dans votre programme. (Une constante nommée, bien sûr, de sorte qu'il serait facile de changer :-p)
alpha = 2 * atan(l / (2 * d))
.La Caméra.Paramètres getHorizontalViewAngle() et getVerticalViewAngle() fonctions vous fournir la base de l'angle de vue. Je dis "de base", parce que celles-ci s'appliquent uniquement à la Caméra elle-même dans un zoomée de l'état, et les valeurs retournées par ces fonctions ne changent pas, même lorsque l'angle de vue lui-même n'.
Deux choses à cause de votre "efficace" angle de vue pour changer de zoom, et à l'aide d'un aperçu de l'aspect ratio qui ne respecte pas les proportions de la caméra.
De Base En Mathématiques
La trigonométrie du champ de vue (Θ) est assez simple:
x est la distance linéaire visible à une distance z; c'est à dire, si vous avez tenu jusqu'à une règle, à une distance z=1 mètre, vous serez en mesure de voir les x mètres de ce souverain.
Par exemple, sur mon appareil, champ de vision horizontal est 52.68° champ de vision vertical est 40.74°. Le convertir en radians et branchez-le dans la formule d'un arbitraire de valeur z de 100m, et vous obtenez les valeurs de x de de 99,0 m(horizontal) et de 74,2 m(vertical). C'est un format 4:3.
Zoom
L'application de ce mathématiques pour les niveaux de zoom n'est que légèrement plus difficile. Maintenant, x est constante et c'est z que les changements dans un taux; nous devons déterminer Θ.
Où z est la base de niveau de zoom (100), z' est le niveau de zoom actuel (à partir de CameraParameters.getZoomRatios), Θ est la base horizontale/verticale du champ de vision, et Θ' est le champ de vue. L'ajout sur le degré->radian conversions rend ce assez bavard.
Ratio D'Aspect
Tandis que l'typiques de la caméra est un format 4:3, l'aperçu peut également être disponible en 5:3 et 16:9 ratios et cela semble être accompli par le fait d'étendre le champ de vision horizontal. Cela semble être sans papiers, donc peu fiable, mais en supposant que la façon dont cela fonctionne, nous pouvons calculer le champ de vision.
Le calcul est semblable à la zoom calculs; toutefois, dans ce cas, z est constante et c'est x qui change. En supposant que le point de vue vertical angle reste inchangé tandis que l'horizontale angle de vision est varié comme le ratio d'aspect de changements, il est possible de calculer le nouveau efficace horizontale angle de vue.
Ici h/v est le rapport d'aspect et Θ est la base de champ de vision vertical, tandis que Θ' est le champ de vision horizontal.
Comme je l'ai dit ci-dessus, puisque cela semble être sans-papiers, c'est tout simplement une supposition qu'il va s'appliquer à tous les appareils; il doit être considéré comme un hack. La bonne solution serait de diviser un nouvel ensemble de fonctions getCurrentHorizontalViewAngle et getCurrentVerticalViewAngle.
J'ai un Droid Incroyable ainsi. Android 2.2 introduit les fonctions que vous recherchez. Dans mon code, j'ai:
Cependant, il faut pour cela que vous avez l'appareil photo ouvert. Je serais intéressé de savoir si il y a un "meilleures pratiques" de façon à ne pas avoir à ouvrir l'appareil photo à chaque fois pour obtenir ces valeurs.
@David Zaslavsky - comment? Quelle est la relation mathématique entre les niveaux de zoom? Je ne peux pas le trouver n'importe où (j'ai demandé dans cette question: Ce qui ne l'Android de zoom de la caméra numéros de représenter mathématiquement?)