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.