una samsung qué pdaf partes mejorar frontal definicion cámara configurar con como celular camara calidad app android math camera angle

android - samsung - pdaf camara



Determinar el ángulo de visión de la cámara del teléfono inteligente (3)

Estoy tratando de determinar el tamaño del campo de visión de la cámara de un teléfono inteligente Droid Incredible. Necesito saber este valor para una aplicación que estoy desarrollando. ¿Alguien sabe cómo puedo averiguarlo / calcularlo programáticamente?


A menos que exista una llamada a la API para eso (no soy un programador de Android, no lo sabría), solo tomaría una foto de una regla desde una distancia conocida, ver qué parte de la regla se muestra en la imagen, luego usa la trigonometría para encontrar el ángulo así:

ahora tienes las dos distancias ly d de la figura. Con algo de goniometría simple, se puede obtener:

tan (α / 2) = (l / 2) / d,

por lo tanto

α = 2 * atan (l / 2d)

Así que con esta fórmula puedes calcular el campo de visión horizontal de tu cámara. Por supuesto, la medición del punto de vista vertical va exactamente de la misma manera, excepto que luego necesita ver el objeto en su posición vertical.

Luego puedes codificarlo como una constante en tu programa. (Una constante nombrada, por supuesto, así que sería fácil de cambiar :-p)


Las funciones Camera.Parameters getHorizontalViewAngle () y getVerticalViewAngle () le proporcionan los ángulos de visión base. Digo "base", porque se aplican solo a la cámara en un estado sin zoom, y los valores devueltos por estas funciones no cambian incluso cuando el ángulo de visión sí lo hace.

Camera.Parameters p = camera.getParameters(); double thetaV = Math.toRadians(p.getVerticalViewAngle()); double thetaH = Math.toRadians(p.getHorizontalViewAngle());

Dos cosas hacen que el ángulo de visión "efectivo" cambie: el zoom y el uso de una relación de aspecto de vista previa que no coincide con la relación de aspecto de la cámara.

Matemáticas básicas

La trigonometría del campo de visión () es bastante simple:

tan (/ 2) = x / 2z

x = 2z tan (Θ / 2)

x es la distancia lineal visible a la distancia z; es decir, si sostuviera una regla a una distancia z = 1 metro, podría ver x metros de esa regla.

Por ejemplo, en mi cámara, el campo de visión horizontal es 52.68 °, mientras que el campo de visión vertical es 40.74 °. Conviértalos en radianes y conéctelos a la fórmula con un valor z arbitrario de 100 m, y obtendrá valores x de 99.0 m (horizontal) y 74.2 m (vertical). Esta es una relación de aspecto 4: 3.

Enfocar

Aplicar esta matemática a los niveles de zoom es solo un poco más difícil. Ahora, x permanece constante y es z lo que cambia en una proporción conocida; debemos determinar Θ.

tan (/ 2) = x / (2z)

tan (''/ 2) = x / (2z'')

Θ ''= 2 atan ((z / z'') tan (Θ / 2))

Donde z es el nivel de zoom base (100), z ''es el nivel de zoom actual (de CameraParameters.getZoomRatios), Θ es el campo de visión horizontal / vertical de la base, y Θ'' es el campo de visión efectivo. Agregar en grados-> conversiones radianes hace esto bastante detallado.

private static double zoomAngle(double degrees, int zoom) { double theta = Math.toRadians(degrees); return 2d * Math.atan(100d * Math.tan(theta / 2d) / zoom); } Camera.Parameters p = camera.getParameters(); int zoom = p.getZoomRatios().get(p.getZoom()).intValue(); double thetaH = zoomAngle(p.getHorizontalViewAngle(), zoom); double thetaV = zoomAngle(p.getVerticalViewAngle(), zoom);

Relación de aspecto

Si bien la cámara típica tiene una relación de aspecto de 4: 3, la vista previa también puede estar disponible en relaciones de 5: 3 y 16: 9 y esto parece lograrse extendiendo el campo de visión horizontal. Esto parece no estar documentado, por lo tanto no es confiable, pero suponiendo que así es como funciona, podemos calcular el campo de visión.

La matemática es similar a los cálculos de zoom; sin embargo, en este caso z permanece constante y es x lo que cambia. Suponiendo que el ángulo de visión vertical permanece sin cambios mientras que el ángulo de visión horizontal varía a medida que cambia la relación de aspecto, es posible calcular el nuevo ángulo de visión horizontal efectivo.

tan (/ 2) = v / (2z)

tan (''/ 2) = h / (2z)

2z = v / tan (Θ / 2)

Θ ''= 2 atan ((h / v) tan (Θ / 2))

Aquí, h / v es la relación de aspecto y Θ es el campo de visión vertical de base, mientras que Θ ''es el campo de visión horizontal efectivo.

Camera.Parameters p = camera.getParameters(); int zoom = p.getZoomRatios().get(p.getZoom()).intValue(); Camera.Size sz = p.getPreviewSize(); double aspect = (double) sz.width / (double) sz.height; double thetaV = Math.toRadians(p.getVerticalViewAngle()); double thetaH = 2d * Math.atan(aspect * Math.tan(thetaV / 2)); thetaV = 2d * Math.atan(100d * Math.tan(thetaV / 2d) / zoom); thetaH = 2d * Math.atan(100d * Math.tan(thetaH / 2d) / zoom);

Como dije anteriormente, ya que esto parece no estar documentado, es simplemente una suposición de que se aplicará a todos los dispositivos; debe ser considerado un hack. La solución correcta sería dividir un nuevo conjunto de funciones getCurrentHorizontalViewAngle y getCurrentVerticalViewAngle.


También tengo un Droid Incredible. Android 2.2 introdujo las funciones que estás buscando. En mi código, tengo:

public double getHVA() { return camera.getParameters().getHorizontalViewAngle(); } public double getVVA() { return camera.getParameters().getVerticalViewAngle(); }

Sin embargo, esto requiere que tengas la cámara abierta. Me interesaría saber si hay una forma de "mejores prácticas" para no tener que abrir la cámara cada vez para obtener esos valores.

@ David Zaslavsky, ¿cómo? ¿Cuál es la relación matemática entre los niveles de zoom? No puedo encontrarlo en ninguna parte (pregunté en esta pregunta: ¿Qué representan matemáticamente los números de zoom de la cámara Android? )