Programa de manipulação de imagem da câmera utilizando multiplicações matriciais e transformações geométricas com foco em programação orientada a objetos para representação dos efeitos.
Developers:
- João Lucas de Moraes Barros Cadorniga JoaoLucasMBC
- Eduardo Mendes Vaz EduardoMVaz
A ferramenta de manipulação de imagem acessa a câmera do computador e permite que o usuário rotacione ou expande a imagem utilizando o teclado.
Para utilizar o live-camera-effects, você deve ter Python instalado no seu computador e seguir os passos:
- Clone o repositório na sua máquina na pasta de sua escolha. Utilize o comando:
git clone https://github.com/JoaoLucasMBC/live-camera-effects.git
- Utilizando o terminal / a IDE de sua escolha, crie uma Virtual Env de Python e a ative:
python -m venv env
env/Scripts/Activate.ps1
(Windows)
- Mude para a pasta do programa e instale as bibliotecas requeridas:
cd ./live-camera-effects
pip install -r requirements.txt
- Após a instalação, rode o arquivo
main.py
pelo terminal para testar o programa:
python main.py
Agora você pode começar a manipular a sua câmera com rotações!
Caso o usuário deseje ver uma demonstração de todas as funcionalidades e efeitos do programa, basta seguir o seguinte roteiro:
- Primeiramente, rode o arquivo main.py, para iniciar a câmera;
- Para entrar no modo rotação, aperte
R
ouT
, para rodar no sentido horário ou anti-horário (o ângulo cresce para baixo no circúlo trigonométrico pois o multiplicamos por -1)! - Ainda no modo rotação, aperte
F
para aumentar a velocidade angular da rotação! - Agora, aperte
X
para voltar ao normal, e poder acessar o modo WASD. - Então, aperte
W
para entrar no modo WASD, e aperteA
ouD
algumas vezes, para girar de pouco em pouco a imagem! - Aperte X para voltar ao normal, e agora experimente expandir ou contrair a imagem da sua câmera, usando
E
ouC
! - Experimente rodar a imagem usando
R
ouT
enquanto sua imagem está contraída! - Agora experimente misturar os efeitos, lembrando de apertar
X
antes de trocar do modo rotação para o modo WASD!
Para realizar as transformações na imagem da câmera, o programa utiliza multiplicações matriciais para alterar cada pixel, e então os retorna transformados para serem renderizados na tela.
O frame da câmera, após ser capturado, é redimensionado para uma proporção 320x420 (visando diminuir o processamento computacional e aumentar a eficiência do programa), e, portanto, é gerada uma matriz de mesmas dimensões que representam os pixels da imagem.
A partir desse momento, os efeitos são aplicados por classes complementares que analisam o input do usuário (realizado pelo teclado e analisado pelos dicionários commands
e aux_commands
) da seguinte maneira:
r
- começa a rotação da imagem no sentido horário, com velocidade de 1°/framet
- começa a rotação da imagem no sentido anti-horário, com velocidade de 1°/frame (ângulos são convertidos para rad nos cálculos e multiplicados por -1)f
- progressivamente dobra a velocidade angular da rotação (não funciona no modo de controle manual)w
- entra no modo de controle manual de rotação utilizando as teclasa
ed
, progredindo 5° por clique das teclase
ec
- controlam a expansão e contração da imagem, respectivamente, em uma razão de dois. Ou o zoom dobra ou é diminuido em 50%x
- reseta todos os estados para a condição inicialq
- encerra o programa e a utilização da câmera
obs: só é possível entrar no modo manual ou modo rotação quando o outro modo não está ativo. para desativar o modo atual, basta pressionar a tecla x
Todas as transformações são realizadas por classes auxiliares (Rotation
e Angle
), as quais possuem métodos estáticos que fazem multiplicações matriciais na matriz de imagem gerada. Após o processo, devolvem a nova imagem que será exibida na tela.
obs: o ângulo é iniciado em 0° e a velocidade angular em 1°/frame
Visando evitar o surgimento de artefatos e pixels vazios na imagem, a transformação é feita de maneira inversa: o programa começa com uma matriz vazia de destino e utiliza as matrizes inversas das transformações para determinar os pixels da imagem original que devem "alimentar" os destinos. Por exemplo, a matriz de origem X
de uma rotação é descoberta a partir da seguinte pré-multiplicação:
Onde
A matriz de rotação R é determinada da seguinte maneira (exemplo de um ângulo de 45°, que é
Para o redimensionamento da imagem, dobrando (Zoom In) ou dividindo por dois (Zoom Out) o tamanho, a matriz respectiva é selecionada pelo input do usuário:
- Zoom In:
- Zoom Out:
Ademais, como as transformações são centradas na origem do sistema de coordenadas, que está na borda, antes delas serem realizadas é preciso transportar a imagem para a origem, utilizando a seguinte matriz
Onde as variações são menos as dimensões da imagem divididos por 2, para que o centro seja movido.
E, ao fim da transformação, o centro da imagem é transladado de volta por
Portanto, a matriz de origem é determinada utilizando as matrizes inversas das transformações aplicadas no destino Xd
:
Finalmente, essa matriz X
de coordenadas representa de onde saem os pixels que acabam nas coordenadas Xd
da imagem final, que é renderizada na tela.
OBS: além disso, são aplicados filtros para tratamento dos pixels:
- Todos os valores dos pixels são transformados para
float
, já que a transformação pode retornar valores decimais. - São filtrados os pixels que cairíam foram do enquadramento de 320x240 antes de passar os pixels da imagem original para o novo array.
A classe Angle
realiza a manipulação do ângulo de rotação a cada loop do programa, de acordo com os comandos do teclado do usuário e um dicionário de ESTADOS
que organiza qual o tipo de rotação (constante ou manual) a direção (normal ou reversa) e o incremento (velocidade angular) da rotação.
Além disso, o método restart
retorna todos os parâmetros para as condições iniciais:
rotate = False
(parado)reverse = False
(direção horária, a qual cresce o ângulo para o lado negativo, já que o multiplicamos por -1 para manter esse efeito)wasd = False
(não está no modo manual)incremento = 1
(velocidade angular de 1°/frame)angle = 0
(retorna para o ângulo inicial)