Estoy tratando de determinar el tamaño del grado del campo de visión de la cámara del teléfono inteligente de Droid Incredible. Necesito saber este valor para una aplicación que estoy desarrollando. ¿Alguien sabe cómo puedo averiguarlo/calcularlo programáticamente?Determinar el ángulo de visión de la cámara del teléfono inteligente
Respuesta
A menos que haya alguna llamada a la API para que (no soy un programador de Android, no sabría), me acaba de tomar una foto de un gobernante de una distancia conocida, ver la cantidad de la regla se muestra en la imagen, a continuación, utilizar la trigonometría para encontrar el ángulo como this:
ahora usted tiene las dos distancias L y D de la figura. Con algunos simples goniometría, se puede obtener:
tan (α/2) = (l/2)/d,
por lo tanto
α = 2 * atan (l/2d)
Con esta fórmula puede calcular el campo de visión horizontal de su cámara. Por supuesto, medir la vertical f.o.v. va exactamente de la misma manera excepto que luego necesita ver el objeto en su posición vertical.
Luego puede codificarlo como una constante en su programa. (Una constante llamada, por supuesto, por lo que sería fácil de cambiar :-p)
Tengo un Droid Incredible también. Android 2.2 introdujo las funciones que está buscando. En mi código, que tengo:
public double getHVA() {
return camera.getParameters().getHorizontalViewAngle();
}
public double getVVA() {
return camera.getParameters().getVerticalViewAngle();
}
Sin embargo, éstas requieren que tenga 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 ningún lado (lo hice en esta pregunta: What do the Android camera zoom numbers mathematically represent?)
Las funciones Camera.Parameters getHorizontalViewAngle() y getVerticalViewAngle() le proporcionan los ángulos de vista base. Digo "base", porque estos se aplican solo a la propia cámara en un estado sin zócalo, 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 su ángulo de "eficaz" para cambiar la vista: zoom, y utilizando 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 de 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 sostienes una regla a una distancia z = 1 metro, podrás 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 °. Convierta estos a 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 de 4: 3.
zoom
La aplicación de este matemáticas para ampliar los niveles es sólo un poco más difícil. Ahora, x permanece constante y es z que cambia en una relació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 la horizontal campo base/vertical de vista y Θ 'es el campo de visión efectivo. Agregar conversiones degree-> radian 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
Mientras la cámara típico es una proporción de 4: 3, la vista previa también pueden estar disponibles en 5: 3 y 16: 9 y esto parece ser logrado por realidad se extiende la campo de visión horizontal. Esto parece estar indocumentado, por lo tanto no es confiable, pero asumiendo 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. Al asumir 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 vertical de base de vista, 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 he dicho anteriormente, ya que éste parece ser indocumentado, es simplemente una conjetura que aplicará a todos los dispositivos; debería considerarse un truco. La solución correcta sería dividir un nuevo conjunto de funciones getCurrentHorizontalViewAngle y getCurrentVerticalViewAngle.
¿Pueden los resultados getHorizontalViewAngle() y getVerticalViewAngle() ser confiables para una amplia variedad de dispositivos? –
¿Hay métodos similares (getVertical/HorizontalViewingAngle() en la API de la cámara2? No los vi, y me preguntaba si los perdí, o si no están presentes.¿Probablemente en CameraCharacteristics? – Innova
@Innova, me pregunto lo mismo, puede ser que esos valores sean demasiado simplistas, pero he buscado en toda la documentación de la cámara2, y no he encontrado ningún tipo de forma directa de hacerlo. – TonyTheJet
- 1. iPhone 4 Especificaciones de la cámara - Campo de visión/Ángulo vertical-horizontal
- 2. ¿Cómo puedo determinar el ángulo del dispositivo?
- 3. Uso de la cámara web para simular la cámara del teléfono en el emulador WP7
- 4. ¿Podemos subir fotos de la cámara del teléfono con HTML5
- 5. Android: ¿detecta el brillo (cantidad de luz) en el entorno del teléfono usando la cámara?
- 6. Windows Mobile: usando la cámara del teléfono con C#
- 7. Complemento de Chrome para obtener el tamaño de la ventana del teléfono inteligente
- 8. HTML5 abra la cámara del teléfono iPhone o Android
- 9. Cómo saber el tamaño de MTU de teléfono inteligente Android
- 10. ¿Cuál es el ángulo de campo de visión correcto para el ojo humano?
- 11. Cómo silenciar el sonido del obturador de la cámara en el teléfono Android
- 12. Reconocimiento de tono de notas musicales en un teléfono inteligente
- 13. iPhone SDK - obtener/calcular el campo de visión de la cámara (FOV) (Realidad Aumentada)
- 14. Usar la cámara del teléfono a través de la intención: ¿la actividad nunca vuelve?
- 15. ¿Existe un firmware de código abierto para cualquier teléfono celular de gama baja (teléfono no inteligente)?
- 16. Deriva del sensor de giroscopio y ángulo correcto Estimación
- 17. Lectura de código de barras utilizando una imagen tomada con la cámara del teléfono móvil
- 18. as3 determinar si se denegó el acceso a la cámara
- 19. recreando el objeto de la cámara después del error 100 (el servidor de la cámara murió)
- 20. ¿Cómo mostrar en pantalla la posición del cursor en una tableta o teléfono inteligente Android?
- 21. ¿Puedo acceder mediante programación a los sensores de un teléfono inteligente a través del navegador y JavaScript?
- 22. ¿El plural inteligente siempre inteligente?
- 23. Cómo mostrar el cuadro de diálogo "ocupado" (rueda giratoria) en el teléfono inteligente
- 24. Visión artificial con Mathematica
- 25. Cálculo del rectángulo delimitador en un ángulo de un polígono
- 26. Usar la cámara del teléfono, después de capturar la actividad de la imagen no regresa a una actividad particular
- 27. La brújula de iPhone presenta un ángulo de inclinación de rumbo incorrecto> aproximadamente 45 °
- 28. Android Autoenfoque de la cámara cuando el usuario retiene la cámara
- 29. ¿Moviéndose de Wiimote a la cámara?
- 30. Elija una imagen de la cámara o galería usando el teléfono
Mejor aún, hazlo configurable por el usuario para que las personas que no tienen un Droid Incredible puedan ajustarlo/calibrarlo. – EboMike
Este valor cambiaría con el nivel de zoom, por supuesto. –
@emddudley: cierto, nunca pensé que el teléfono tuviera un nivel de zoom. Aunque dado el ángulo de visión en cualquier nivel de zoom, debería ser posible calcularlo en cualquier otro nivel de zoom. –