Hace un año y medio, estaba navegando en el blog de uno de los fotógrafos de retratos rusos exitosos con un estilo reconocible, y el pensamiento se me vino a la cabeza, ¿por qué no solo poner la cámara en un trípode, poner las luces en el estudio una vez, configurar todos los ajustes de la cámara y procesar automáticamente las fotos con la imagen dada? perfil? Las fotos del blog fueron geniales, pero muy similares entre sí.

Como pertenezco a personas que no saben cómo tomar fotos en el teléfono y que les gustan las cámaras, me gustó mucho la idea. Sí, vi todo tipo de fotomatones y soportes de fotos, pero los desarrolladores de estos dispositivos ni siquiera han dominado la fabricación de colores normales. Decidí que esto se debía a que los desarrolladores no entendían la fotografía.
De modo que con esta idea no sucede lo mismo que con los demás (que no se movieron o se estancaron en la etapa inicial). Decidí que lo más importante era hacer que todo funcionara como un todo, y no pulir algún componente separado para que brille. Y dado que tengo muy poco tiempo de desarrollo, después del trabajo principal a tiempo completo, tengo 1-2 horas de fuerza máxima y un poco más durante el fin de semana, debes tratar de no aprender nada nuevo, aprovechar al máximo el conocimiento disponible.
Quiero decir en este artículo qué problemas tuve en mi camino y cómo los resolví.
Una pequeña explicación de las condiciones y el equipo de disparo: solo consideré cámaras con el sensor APS-C mínimo y flashes de estudio profesionales, esta es la única forma de garantizar imágenes de alta calidad en cualquier momento del día o de la noche.
Todas las personas de diferente estatura.
Lo primero que me sorprendió encontrar cuando puse la cámara en un trípode es que no es tan fácil encajar en el marco e incluso tener una buena composición. Cuando se mueve desde y hacia la cámara, toda la composición también se deteriora si se coloca correctamente para una persona específica parada en un punto determinado. Sí, puede poner una silla y decir que necesita sentarse en una silla, pero no será muy interesante. Todavía puede recortar las fotos, pero la calidad se deteriorará considerablemente. Bueno, la última forma que elegí es hacer que la cámara apunte automáticamente.
También hay 2 opciones aquí. Correcto: el eje óptico siempre es horizontal, la cámara se mueve hacia arriba y hacia abajo y es más fácil de implementar: ajuste la posición de la cámara con inclinaciones. En este caso, habrá distorsiones prometedoras, pero se corrigen bastante bien durante el procesamiento si recuerda el ángulo de la cámara.
Como prácticamente no tenía experiencia en la fabricación de ningún tipo de dispositivos de hierro, intenté encontrar algo lo más listo posible para usar. Encontré varios dispositivos para disparos panorámicos dentro del rango de $ 1000, todos los cuales hicieron posible controlar manualmente las inclinaciones y giros, así como disparar automáticamente panoramas. Pero era imposible controlarlos desde una computadora. También hay bastantes dispositivos para controlar cámaras de video, para disparar desde grúas de cámara, por ejemplo. Los buenos dispositivos que tienen pistas de control digital son muy caros y no está completamente claro si hay alguna API disponible. Como resultado, encontré aquí un dispositivo de este tipo en un sitio popular:

De la electrónica no hay nada. Hace un año, solo estaba disponible la versión con motores de colector (con cajas de cambios integradas), que compré. Era necesario de alguna manera administrar esto desde una computadora. En el foro de nuestro instituto, sugirieron que la forma más económica es usar el Arduino. Entonces lo hice. Compré otro protector de motor, ya que los motores funcionan con 12 voltios. Después de intentar encender esto, sentí todo el dolor que los motores de los colectores pueden causar a una persona: no solo son imposibles de rotar en un ángulo dado, simplemente "girar un poco" tampoco es fácil. Mi primer pensamiento fue poner un motor paso a paso allí. Durante mucho tiempo estuve buscando un motor paso a paso que encajara en esta plataforma en lugar del que estaba parado allí, pero no pude encontrarlo. Luego comenzó a pensar en cómo puede atornillar el servo, incluso lo compró, pero tampoco pudo encontrar nada confiable. El siguiente pensamiento fue fijar el acelerómetro a la plataforma y rotar gradualmente la plataforma a un ángulo predeterminado. Atornillé el acelerómetro con un giroscopio y una brújula, pero estaba muy defectuoso y también rechacé esta idea (un mes después me di cuenta de que la fuente de alimentación china de la cámara era la responsable de los problemas técnicos del acelerómetro, de los cuales no hubo mala interferencia). Y luego leí accidentalmente cómo se organiza el servo. Me gustó la idea de atornillar una resistencia para medir el ángulo, pero tuve que conectarla de alguna manera a una polea. Tuve que aprender FreeCAD y usar la impresión 3D por primera vez en mi vida. En resumen, después de procesar con un archivo, todo se pudo recopilar.

Tuve que atormentarme con el programa para que arduino establezca un ángulo dado, ya que la cámara en la plataforma tiene un gran momento de inercia y no se detiene de inmediato. Pero al final, resultó establecer el ángulo con una precisión de aproximadamente 1 grado.
Ahora sobre el objetivo automático: la idea es simple de hacer que la cara esté en la parte superior del marco. Por lo tanto, solo necesita encontrar una cara y ajustar la plataforma en cada imagen desde liveview. No sabía nada sobre identificar rostros, así que utilicé el tutorial usando los signos de Haar (cascadas de haar). Descubrí que para las personas este método no funciona. Encuentra en cada cuadro un montón de basura además de lo que se necesita y consume mucho tiempo de procesador. Luego encontró otro ejemplo de cómo usar redes neuronales a través de OpenCV. ¡Las redes neuronales funcionan bien! Pero me alegré hasta que comencé a procesar fotos en paralelo. Y Linux de alguna manera comenzó a asignar tiempo de procesador entre el hilo de administración de la plataforma y los procesos de procesamiento de fotos. Tomó el camino de menor resistencia: comenzó a hacer muecas en la tarjeta de video. Todo comenzó a funcionar perfectamente.
A pesar del hecho de que no quería profundizar en los detalles, sin embargo, realicé una pequeña prueba. Y compré Intel Neural Compute Stick 2: intenté contar con él en lugar de una tarjeta de video. Mis resultados son aproximadamente los mismos (dígitos - tiempo de procesamiento para una imagen de tamaño 800x533) -
- Core i5 9400F - 59
- Core i7 7500U - 108
- Core i7 3770-110
- GeForce GTX 1060 6Gb - 154
- GeForce GTX 1050 2Gb - 199
- Core i7 3770, ubuntu 18.04 con opencv de OpenVINO - 67
- Intel Neural Compute Stick 2, ubuntu 18.04 con opencv de OpenVINO - 349
Resultó que era suficiente procesar imágenes de tamaño 300 en el lado más pequeño para que la cara de una persona parada a toda altura en el marco se ubicara de manera confiable. Funciona más rápido en tales imágenes. Actualmente uso la GeForce GTX 1050. Estoy seguro de que se puede mejorar mucho, pero ahora hay un problema mucho más grave.
Exposición
No es ningún secreto que la fotografía debe estar correctamente expuesta. En mi caso, esto es aún más importante ya que no hay retoques. Para que los defectos de la piel sean menos notorios, la foto debe ser lo más clara posible, al borde de la sobreexposición, pero sin sobreexposición.
El brillo de la imagen final cuando se dispara con flash depende de los siguientes parámetros:
- Potencia de flash
- La distancia desde el flash al sujeto
- Apertura
- Valor ISO
- Opciones al convertir de RAW
Una vez hecho el marco, solo podemos cambiar el último parámetro. Pero cambiarlo en un rango amplio no es muy bueno, porque con una gran corrección positiva de la exposición del marco oscuro habrá ruido, y en el caso contrario puede haber recorte en áreas brillantes.
El sistema TTL (a través de la lente) se utiliza para determinar automáticamente la exposición durante el disparo con flash. Funciona de la siguiente manera:
- El flash hace una serie de pequeños flashes.
- En este momento, la cámara mide la exposición, enfoca y mide la distancia al sujeto enfocado.
- En base a estos datos, calcula la potencia flash requerida.
- El flash se dispara nuevamente, y en este momento se abre el obturador, se toma una fotografía.
Este sistema funciona muy bien cuando puede ajustar manualmente las imágenes después de disparar. Pero para obtener el resultado final, funciona de manera insatisfactoria. Si es así, probé el flash Profoto durante> 100 t.r.
Tengo condiciones bien conocidas, los flashes deberían estar todo el tiempo en un solo lugar. Por lo tanto, simplemente puede calcular la exposición por la posición de una persona en el espacio. El problema surge: ¿cómo determinar la posición de una persona?
La primera idea era simplemente tomar la distancia al objeto de enfoque desde EXIF y que el primer cuadro hiciera mucha compensación de exposición en el convertidor RAV, y para el siguiente, ajustar la potencia del flash o la apertura. Es muy probable que una persona haga muchos disparos, de pie en un solo lugar. Pero resultó que la distancia en EXIF se escribe de manera muy discreta, cuanto más lejos esté el objeto, mayor será el paso. Además, para diferentes lentes, la distancia al objeto toma diferentes conjuntos de valores, y algunos no lo miden en absoluto.
La siguiente idea es usar un telémetro ultrasónico. Este dispositivo mide la distancia con bastante precisión, pero solo hasta un metro y solo si una persona no está vestida con algo que absorba las ondas de sonido. Si coloca el telémetro en el servo y lo gira como un radar, mejora un poco: mide hasta 1,5 metros, que también es muy pequeño (las personas obtienen lo mejor si los dispara desde una distancia de 2 metros).
Por supuesto, sabía que incluso los teléfonos económicos ya construyen mapas de profundidad y difuminan el fondo de forma selectiva. Pero no quería involucrarme en eso. Lamentablemente, no había otra opción. Primero quería comprar 2 cámaras web, combinarlas y leer el mapa de desplazamiento usando OpenCV. Pero, afortunadamente, encontré muchas cámaras de profundidad que ya hacen esto dentro de sí mismas. Elegí Intel D435 (si alguien quiere comprar uno, no es compatible con Linux en la rama principal del núcleo. Hay parches para debian y ubuntu en el repositorio de librealsense. Tuve que arreglarlos para fedora).

Tan pronto como conecté todo, escribí un programa de prueba que mide la distancia a un pequeño cuadrado en el centro. Entonces este código aún funciona. Y funciona bastante bien. Por supuesto, debe buscar una cara en la imagen desde la cámara RGB y calcular la distancia desde el flash a esa cara. Pero estos son planes para el futuro.
Según la posición de una persona en el espacio, es necesario calcular la corrección de la exposición. Al principio se me ocurrió una fórmula que funcionaba solo para una fuente puntual de luz en el vacío (de hecho, la ausencia de paredes reflectantes y techo importaban). Pero luego hizo una serie de disparos con una potencia de flash constante y ajustó la exposición en un ecualizador a simple vista, resultó que la corrección dependía casi linealmente de la distancia. Utilizo el esquema de iluminación Rembrandt, un flash con una softbox está en el plano de la cámara.
Pero hay que hacer algo con la corrección de la exposición. Idealmente, debe cambiar la potencia del flash, pero hasta ahora mi diafragma y aditivos están cambiando <1 / 6Ev - en el convertidor rav. Mi sincronización de flash se puede controlar a través de Bluetooth usando la aplicación del teléfono. Así que en el futuro planeo descubrir cómo se organiza el protocolo allí y cambiar la potencia de los flashes.
Aquí hay una comparación de salida flash constante con TTL y mi método. Funciona mucho más estable y con mayor precisión TTL:

Variedad
Cuando una niña (o incluso un hombre) acude al fotógrafo para una sesión de fotos, ella (o él) generalmente quiere una foto de un plan diferente, uno más grande, donde solo su cara y más general son de cuerpo entero o hasta la cintura. No todos lo saben, pero lo mejor de todo es que el plan cambia cambiando la distancia focal de la lente. Es decir, una persona siempre se para a una distancia de, digamos, 2 metros, si necesitamos disparar a toda altura, envolvemos la lente de 35 mm, si solo la cara mide 135 mm, y si está a la altura de la cintura, entonces 50 mm o 85 mm. Bueno, o no cambie las lentes y configure la lente con zoom. Ofrecer al usuario que gire el zoom con las manos en la cámara, que se encuentra en una plataforma móvil, rompiendo un montón de cables, no suena muy bien. Así que compré un paquete de repuestos en aliexpress, tomé un servoaccionamiento que no me fue útil para controlar la plataforma e hice esto:

Y así es como funciona:
Los resultados de la primera prueba en un estudio fotográfico, en primer lugar, quería ver qué tan diversa sería tomar fotos, no movieron nada ni reconfiguraron durante el disparo:

Procesar video:
Resultado
Estas son algunas de las mejores tomas que se han hecho:

como todos pidieron permiso para publicar, si te reconoces y quieres eliminar la foto, escríbeme
¿Por qué hice esto? Esto es algo que aún no ha sucedido, al menos no he encontrado nada parecido. Potencialmente útil: ahora hay muchos especialistas, como psicólogos, entrenadores de negocios, entrenadores deportivos, peluqueros que venden sus servicios a través de blogs, necesitan muchas fotos y exactamente la forma en que quieren, no el fotógrafo. A algunas personas simplemente no les gusta cuando un extraño (fotógrafo) los mira al disparar. Bueno, lo más simple es un gran entretenimiento para eventos corporativos, exposiciones y otros eventos.
No describí la parte del software, cómo se procesan las fotos y la interacción del usuario, dado que ya hay mucho texto, escribiré la segunda parte más adelante. Estos puntos ya están bastante bien resueltos para que las personas que no estén familiarizadas con la programación puedan usar el sistema.