Há um ano e meio, eu estava navegando no blog de um dos bem-sucedidos fotógrafos de retratos russos com um estilo reconhecível, e o pensamento me veio à mente: por que não colocar a câmera em um tripé, colocar as luzes no estúdio uma vez, definir todas as configurações da câmera e fazer o processamento automático de fotos com o dado perfil? As fotos do blog foram ótimas, mas muito parecidas entre si.

Como pertenço a pessoas que não sabem tirar fotos no telefone e gostam de câmeras, gostei muito da ideia. Sim, vi todos os tipos de cabines e suportes para fotos, mas os desenvolvedores desses dispositivos nem sequer dominam a criação de cores normais. Decidi que isso acontecia porque os desenvolvedores não entendiam fotografia.
Para que, com essa idéia, o mesmo não aconteça com os outros (que não se mexeram ou pararam no estágio inicial). Decidi que o mais importante era fazer tudo funcionar como um todo, e não polir algum componente separado para brilhar. E como tenho muito pouco tempo de desenvolvimento, após o trabalho principal em período integral, tenho uma força máxima de 1-2 horas e um pouco mais no final de semana, tente não aprender nada de novo, aproveitar ao máximo o conhecimento disponível.
Quero contar neste artigo que problemas tive no meu caminho e como os resolvi.
Uma pequena explicação sobre as condições e o equipamento de filmagem: considerei apenas câmeras com o sensor APS-C mínimo e flashes profissionais de estúdio, esta é a única maneira de garantir imagens de alta qualidade a qualquer hora do dia ou da noite.
Todas as pessoas de estatura diferente
A primeira coisa que fiquei surpreso ao descobrir quando coloco a câmera em um tripé é que não é tão fácil encaixar no quadro e até ter uma boa composição. Quando você se move de e para a câmera, toda a composição também se deteriora se for colocada corretamente para uma pessoa específica parada em um determinado ponto. Sim, você pode colocar uma cadeira e dizer que precisa sentar em uma cadeira, mas isso não será muito interessante. Você ainda pode cortar as fotos, mas a qualidade se deteriorará bastante. Bem, a última maneira que eu escolhi é fazer a câmera apontar automaticamente.
Existem também 2 opções aqui. Correto - o eixo óptico é sempre horizontal, a câmera se move para cima e para baixo e é mais fácil de implementar - ajuste a posição da câmera com inclinações. Nesse caso, haverá distorções promissoras, mas elas serão muito bem corrigidas durante o processamento, se você se lembrar do ângulo da câmera.
Como eu praticamente não tinha experiência na fabricação de nenhum tipo de dispositivo de ferro, tentei encontrar algo o mais pronto possível para usar. Encontrei vários dispositivos para filmagem panorâmica na faixa de US $ 1000, os quais possibilitaram controlar manualmente inclinações e curvas, além de fotografar automaticamente panoramas. Mas era impossível controlá-los a partir de um computador. Existem também alguns dispositivos para controlar câmeras de vídeo, para fotografar com guindastes de câmera, por exemplo. Bons dispositivos que têm dicas de controle digital são muito caros e não está totalmente claro se existe alguma API disponível. Como resultado, encontrei aqui esse dispositivo em um site popular:

Da eletrônica não há nada. Há um ano, apenas a versão com motores coletores (com caixas de câmbio integradas) estava disponível, que eu comprei. Era necessário, de alguma forma, gerenciar essa coisa a partir de um computador. No fórum do nosso instituto, eles sugeriram que a maneira mais acessível é usar o Arduino. Então eu fiz. Eu comprei outro escudo do motor, já que os motores são alimentados por 12 volts. Depois que tentei ligar isso, senti toda a dor que os motores coletores podem causar a uma pessoa - eles não são apenas impossíveis de girar em um determinado ângulo, apenas "girar um pouco" também não é fácil. Meu primeiro pensamento foi colocar um motor de passo lá. Durante muito tempo, procurei um motor de passo que se encaixasse nessa plataforma em vez do que estava ali, mas não consegui encontrá-lo. Então ele começou a pensar em como você pode parafusar o servo nele, até comprá-lo, mas também não conseguiu encontrar nada confiável. O próximo pensamento era fixar o acelerômetro na plataforma e girar a plataforma gradualmente para um ângulo predeterminado. Eu estraguei o acelerômetro com um giroscópio e uma bússola, mas foi muito complicado e também recusei essa ideia (um mês depois, percebi que a fonte de alimentação chinesa da câmera era responsável pelas falhas do acelerômetro, das quais não havia captadores ruins). E então li acidentalmente como o servo é organizado. Gostei da ideia de parafusar um resistor para medir o ângulo, mas tive que conectá-lo de alguma forma a uma polia. Eu tive que aprender o FreeCAD e usar a impressão 3D pela primeira vez na minha vida. Em resumo, após o processamento com um arquivo, tudo pôde ser montado.

Tive que me atormentar com o programa do arduino para definir um determinado ângulo, pois a câmera na plataforma tem um grande momento de inércia e não para imediatamente. Mas no final, acabou por definir o ângulo com uma precisão de cerca de 1 grau.
Agora, sobre a mira automática - a idéia é simples de fazer o rosto ficar no topo da moldura. Então, você só precisa encontrar um rosto e ajustar a plataforma em todas as fotos da visualização ao vivo. Eu não sabia nada sobre a identificação de rostos, então usei o tutorial usando os sinais de Haar (cascatas de haar). Eu descobri que, para indivíduos, esse método não funciona. Ele encontra em cada quadro um monte de lixo além do necessário e consome muito tempo do processador. Então ele encontrou outro exemplo de como usar redes neurais através do OpenCV. Redes neurais funcionam muito bem! Mas fiquei feliz até começar a processar fotos em paralelo. E o Linux de alguma maneira começou a alocar o tempo do processador entre o encadeamento de gerenciamento da plataforma e os processos de processamento de fotos. Ele seguiu o caminho de menor resistência - ele começou a fazer caretas na placa de vídeo. Tudo começou a funcionar perfeitamente.
Apesar de não querer me aprofundar nos detalhes, no entanto, realizei um pequeno teste. E comprei o Intel Neural Compute Stick 2 - tentei contar com ele em vez de uma placa de vídeo. Meus resultados são aproximadamente os mesmos (dígitos - tempo de processamento para uma imagem com tamanho de 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 com opencv do OpenVINO - 67
- Intel Neural Compute Stick 2, ubuntu 18.04 com opencv do OpenVINO - 349
Descobriu-se que bastava processar imagens do tamanho 300 no lado menor, para que o rosto de uma pessoa em pé a toda a altura da armação fosse localizado com segurança. Funciona mais rápido em tais imagens. Atualmente, uso a GeForce GTX 1050. Tenho certeza de que ela pode ser bastante aprimorada, mas agora há um problema muito mais sério.
Exposição
Não é segredo que a fotografia deve ser exposta corretamente. No meu caso, isso é ainda mais importante, pois não há retoques. Para que os defeitos da pele sejam menos perceptíveis, a foto deve ser a mais clara possível, à beira da superexposição, mas sem superexposição.
O brilho da imagem final ao fotografar com flash depende dos seguintes parâmetros:
- Potência do flash
- A distância do flash ao objeto
- Abertura
- Valor ISO
- Opções ao converter de RAW
Depois que o quadro é feito, só podemos alterar o último parâmetro. Mas alterá-lo em uma ampla faixa não é muito bom, porque com uma grande correção positiva da exposição da moldura escura, haverá ruído e, no caso oposto, pode haver recorte em áreas claras.
O sistema TTL (através da lente) é usado para determinar automaticamente a exposição durante o disparo com flash. Funciona da seguinte maneira:
- O flash produz uma série de pequenos flashes.
- Neste momento, a câmera mede a exposição, foca e mede a distância do objeto em foco.
- Com base nesses dados, calcula a saída de flash necessária.
- O flash dispara novamente e, neste momento, o obturador abre, é tirada uma foto.
Este sistema funciona muito bem quando você pode ajustar manualmente as fotos após o disparo. Mas, para obter o resultado final, ele funciona de maneira insatisfatória. Se isso - eu tentei o flash Profoto para> 100t.r.
Tenho condições bem conhecidas, os flashes devem ficar o tempo todo em um só lugar. Assim, você pode simplesmente calcular a exposição pela posição de uma pessoa no espaço. O problema surge - como determinar a posição de uma pessoa?
A primeira idéia foi simplesmente distanciar o objeto de foco do EXIF e para o primeiro quadro fazer muita compensação de exposição no conversor RAV e, no próximo, ajustar a potência ou a abertura do flash. É muito provável que uma pessoa faça muitos disparos, de pé em um só lugar. Mas descobriu-se que a distância em EXIF é muito discreta, quanto mais o objeto - maior o passo. Além disso, para lentes diferentes, a distância para o objeto requer conjuntos de valores diferentes, e alguns não o medem.
A próxima idéia é usar um telêmetro ultrassônico. Este dispositivo mede a distância com bastante precisão, mas apenas até um metro e somente se uma pessoa não estiver vestida com algo que absorva as ondas sonoras. Se você colocar o telêmetro no servo e girá-lo como um radar, ele ficará um pouco melhor - ele mede até 1,5 metros, o que também é muito pequeno (as pessoas conseguem o melhor se você atirar a uma distância de 2 metros).
Claro, eu sabia que mesmo telefones baratos já constroem mapas de profundidade e desfocam o fundo seletivamente. Mas eu não queria me envolver nisso. Infelizmente, não havia escolha. Primeiro, eu queria comprar 2 webcams, combiná-las e ler o mapa de deslocamento usando o OpenCV. Felizmente, porém, encontrei muitas câmeras de profundidade que já fazem isso dentro de si. Eu escolhi o Intel D435 (se alguém quiser comprar um, ele não é suportado no Linux no ramo principal do kernel. Existem patches para debian e ubuntu no repositório librealsense. Eu tive que corrigi-los para o fedora).

Assim que conectei tudo, escrevi um programa de teste que mede a distância de um pequeno quadrado no centro. Portanto, esse código ainda funciona. E funciona muito bem. Obviamente, você precisa procurar um rosto na imagem da câmera RGB e calcular a distância do flash até o rosto. Mas esses são planos para o futuro.
De acordo com a posição de uma pessoa no espaço, é necessário calcular a correção da exposição. No começo, criei uma fórmula que funcionava apenas para uma fonte pontual de luz no vácuo (na verdade, a ausência de paredes e teto refletores importava). Mas então ele acabou de fazer uma série de fotos com uma saída de flash constante e ajustou a exposição em um equalizador a olho, verificou-se que a correção dependia quase linearmente da distância. Eu uso o esquema de iluminação Rembrandt, um flash com uma softbox está no plano da câmera.
Mas algo precisa ser feito com a correção da exposição. Idealmente, você precisa alterar a potência do flash, mas até agora meu diafragma e aditivos estão mudando <1 / 6Ev - no conversor de rav. Minha sincronização com flash pode ser controlada via bluetooth usando o aplicativo de telefone. Então, no futuro, pretendo descobrir como o protocolo está organizado lá e mudar a potência dos flashes.
Aqui está uma comparação da saída de flash constante com TTL e meu método. Funciona muito mais estável e com mais precisão TTL:

Variedade
Quando uma garota (ou até mesmo um cara) vem ao fotógrafo para uma sessão de fotos, ela (ou ele) geralmente quer uma foto de um plano diferente, maior, onde apenas o rosto e mais geral - em toda a altura ou cintura. Nem todo mundo sabe, mas o melhor de tudo é que o plano é alterado alterando a distância focal da lente. Ou seja, uma pessoa sempre fica a uma distância de, digamos, 2 metros, se precisarmos fotografar em altura total, enrolamos a lente de 35 mm, se apenas o rosto tiver 135 mm e, na altura da cintura, 50 ou 85 mm. Bem, ou não troque as lentes e ajuste-as com zoom. Oferecer ao usuário girar o zoom com as mãos na câmera, que fica em uma plataforma móvel, rompendo um feixe de fios, não parece muito bom. Comprei um pacote de peças de reposição no aliexpress, peguei um servo drive que não me era útil para controlar a plataforma e fiz o seguinte:

E é assim que funciona:
Os resultados do primeiro teste em um estúdio de fotografia, antes de tudo, eu queria ver o quão diversificado seria para tirar fotos, não moveu nada ou se reconfigurou durante as filmagens:

Processo de vídeo:
Resultado
Estas são algumas das melhores fotos que foram feitas:

como todos pediram permissão para publicar, se você se reconhece e deseja remover a foto - escreva para mim
Por que eu fiz isso? Isso ainda não aconteceu, pelo menos não encontrei nada parecido. Potencialmente útil - agora existem muitos especialistas, como psicólogos, treinadores de negócios, treinadores esportivos, cabeleireiros que vendem seus serviços através de blogs, eles precisam de muitas fotos e exatamente da forma que desejam, não o fotógrafo. Algumas pessoas simplesmente não gostam quando um estranho (fotógrafo) olha para elas ao fotografar. Bem, o mais simples é um ótimo entretenimento para eventos corporativos, exposições e outros eventos.
Não descrevi a parte do software, como as fotos são processadas e sobre a interação do usuário, uma vez que já há muito texto, escreverei a segunda parte posteriormente. Esses pontos já estão muito bem elaborados para que pessoas que não estão familiarizadas com a programação possam usar o sistema.