3 votes

Quel est l'équivalent de Camera.Parameters.getHorizontalViewAngle() et Camera.Parameters.getVerticalViewAngle() dans l'API Android Camera2 ?

Tout est dans le titre, mais dans l'API Android Camera, aujourd'hui obsolète, il y avait deux méthodes : Camera.Parameters.getHorizontalViewAngle() et Camera.Parameters.getVerticalViewAngle().

Maintenant, avec l'API Camera2 actuelle, il semble qu'il n'y ait pas d'équivalent dans la documentation. Je suppose que c'est parce que les angles FOV sont plus compliqués et nuancés qu'une simple valeur horizontale et verticale, mais je ne trouve aucune information en ligne sur la façon de calculer le champ de vision total pour un appareil Android en utilisant la nouvelle API Camera2.

9voto

Eddy Talvala Points 1655

La formule de base est la suivante

FOV.x = 2 * atan(SENSOR_INFO_PHYSICAL_SIZE.x / (2 * LENS_FOCAL_LENGTH))
FOV.y = 2 * atan(SENSOR_INFO_PHYSICAL_SIZE.y / (2 * LENS_FOCAL_LENGTH))

Il s'agit d'un approximation en supposant qu'il s'agisse d'un objectif idéal, etc., mais il est généralement suffisant.

Cela permet de calculer le champ de vision pour l'ensemble des pixels du capteur.

Cependant, le champ de vision réel d'une sortie donnée sera plus petit ; tout d'abord, la zone de lecture du capteur est souvent plus petite que la matrice de pixels complète, de sorte qu'au lieu d'utiliser PHYSICAL_SIZE directement, vous devez d'abord la mettre à l'échelle en fonction du rapport entre le nombre de pixels de la matrice de pixels et le nombre de pixels de la matrice active (SENSOR_INFO_ACTIVE_ARRAY_SIZE / SENSOR_INFO_PIXEL_ARRAY_SIZE).

Ensuite, le champ de vision dépend du rapport d'aspect de la ou des sorties que vous avez configurées (un FOV 16:9 sera différent d'un FOV 4:3), par rapport au rapport d'aspect de la matrice active, et au rapport d'aspect de la région de recadrage (zoom numérique) si elle est plus petite que la matrice active complète.

Chaque tampon de sortie sera le résultat d'un recadrage minimal du cropRegion pour la demande de capture correspondante afin d'obtenir le bon rapport hauteur/largeur de sortie. ( http://source.Android.com/devices/camera/camera3_crop_reprocess.html a des diagrammes).

Supposons que nous ayons un capteur dont la matrice de pixels est de (120,120), et que nous ayons un rectangle de matrice active de (10,10)-(110,110), soit une largeur/hauteur de 100,100.

Nous configurons deux sorties, la sortie A est (40,30), la sortie B est (50, 50). Laissons la région de culture au maximum (0,0)-(100,100).

Le champ de vision horizontal pour les sorties A et B sera le même, car le recadrage de la surface maximale permettra aux deux sorties d'utiliser toute la largeur de la matrice active :

output_physical_width = SENSOR_INFO_PHYSICAL_SIZE.x * ACTIVE_ARRAY.w / PIXEL_ARRAY.w
FOV_x = 2 * atan(output_physical_width / (2 * LENS_FOCAL_LENGTH))

Toutefois, les champs d'observation verticaux seront différents - la sortie A n'utilisera que les trois quarts de l'espace vertical en raison de l'inadéquation du rapport hauteur/largeur :

active_array_aspect = ACTIVE_ARRAY.w / ACTIVE_ARRAY.h
output_a_aspect = output_a.w / output_a.h
output_b_aspect = output_b.w / output_b.h
output_a_physical_height = SENSOR_INFO_PHYSICAL_SIZE.y * ACTIVE_ARRAY.h / PIXEL_ARRAY.h * output_a_aspect / active_array_aspect
output_b_physical_height = SENSOR_INFO_PHYSICAL_SIZE.y * ACTIVE_ARRAY.h / PIXEL_ARRAY.h * output_b_aspect / active_array_aspect
FOV_a_y = 2 * atan(output_a_physical_height / (2 * LENS_FOCAL_LENGTH))
FOV_b_y = 2 * atan(output_b_physical_height / (2 * LENS_FOCAL_LENGTH))

Cela fonctionne lorsque le rapport d'aspect de la sortie est <= rapport d'aspect du tableau actif (letterboxing) ; si ce n'est pas le cas, la dimension horizontale de la sortie est réduite et la dimension verticale couvre l'ensemble du tableau actif (pillarboxing). Le facteur d'échelle pour la direction horizontale est donc active_array_aspect/output_aspect.

Si vous souhaitez calculer le champ de vision pour une vue agrandie, remplacez les dimensions/rapport d'aspect de la région de culture par les dimensions/rapport d'aspect de la matrice active.

3voto

Joel Teply Points 261
private float getHFOV(CameraCharacteristics info) {
    SizeF sensorSize = info.get(CameraCharacteristics.SENSOR_INFO_PHYSICAL_SIZE);
    float[] focalLengths = info.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS);

    if (focalLengths != null && focalLengths.length > 0) {
        return (float) (2.0f * atan(sensorSize.getWidth() / (2.0f * focalLengths[0])));
    }

    return 1.1f;
}

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