Estou tentando desfocar uma parte do vídeo usando o FFmpeg (especificamente para desfocar um rosto).
Eu tenho tentado usar uma combinação de edição da linha do tempo e os vários filtros de desfocagem, mas não consigo encontrar uma maneira de desfocar apenas uma seção do vídeo.
É possível aplicar o desfoque temporal e espacial a um segmento / seção - assumindo que a área que você deseja desfocar seja um local estático.
Imagem original do filhote de cachorro preto do laboratório.
Usando uma imagem de máscara
Imagem em máscara de escala de cinza PNG e imagem borrada resultante.
Você pode criar uma imagem de máscara em escala de cinza para indicar a área a desfocar. Para facilitar o uso, ele deve ter o mesmo tamanho da imagem ou do vídeo que você deseja desfocar.
A área branca é onde o desfoque ocorrerá, mas isso pode ser facilmente revertido com o filtro de negação, por exemplo:[1:v]negate[mask];[0:v][mask]alphamerge,boxblur=10[alf]...
Você pode usar o filtro geq para gerar uma máscara, como um gradiente.
Nota: Os números de deslocamento x e y na sobreposição ( 60e 30neste exemplo) devem corresponder às compensações de corte.
O que este exemplo faz:
Corte a cópia para ter o tamanho da área a ser desfocada. Neste exemplo: uma caixa de 200 x 200 pixels com 60 pixels à direita ( xeixo) e 30 pixels abaixo ( yeixo) no canto superior esquerdo.
Desfoque a área cortada.
Sobreponha a área desfocada usando o mesmo xe os yparâmetros do filtro de corte .
Vários borrões em áreas específicas (sem máscara)
Áreas borradas no canto superior esquerdo, próximo ao centro e inferior.
Muito obrigado pela sua resposta. Tudo isso faz muito sentido. Como nota lateral, também fez o filtro de divisão finalmente fazer sentido! Além disso, através de expressões aritméticas, seria possível mover dinamicamente a caixa desfocada em torno da imagem? Ou seja, com o objetivo de desfocar o rosto de alguém enquanto ele se move de maneira não linear?
occvtech
Obrigado novamente! Eu vou dar um tempo nisso. Sei que um editor não linear seria 1000 vezes mais fácil aqui, mas espero processar em lote vários arquivos e não quero esperar o processo de importação / quadro-chave / exportação. Obrigado novamente!
Octvtech 16/04
1
o FFMPEG oferece outras formas além de caixas, como círculos?
Sun
@LordNeckbeard Estou usando cmd e eu quero usar Exemplo 1, mas quando eu executar o código eu recebo este erroUnrecognized option 'filter_complex[0:v]crop=200:200:60:30,boxblur=10[fg];[0:v][fg]overlay=60:30[v]-map [v] -map 0:a -c:v libx264 -c:a copy -movflags +faststart output.mp4'. Error splitting the argument list: Option not found
Jim
1
@ Jim notei que meu comando de exemplo estava faltando uma citação. Seu comando deve ser algo parecido com isto:ffmpeg -i input.mp4 -filter_complex "[0:v]crop=200:200:60:30,boxblur=10[fg]; [0:v][fg]overlay=60:30[v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy -movflags +faststart output.mp4
llogan
0
No caso de alguém não gostar da borda afiada do embaçamento, criei um script que envolve diferentes estágios do embaçamento, para que a borda não fique afiada e fique assim:
Você pode alterar os parâmetros na última e na penúltima linha, os dois últimos parâmetros entre aspas são o caminho para o seu vídeo e o vídeo de saída (supondo que eles estejam no diretório de trabalho). Na penúltima linha:
os dois primeiros números indicam o tamanho da área inicial à qual o desfoque máximo será aplicado,
os dois segundos indicam as coordenadas xey das mesmas,
os terceiros dois indicam os tempos em segundos em que o desfoque deve ser aplicado,
"25" neste exemplo indica que haverá 25 caixas aplicadas umas sobre as outras)
o próximo "1" indica que caixas maiores com menos desfoque devem ser apenas um pixel mais largo que seus antecessores
o segundo "1" indica que o desfoque deve aumentar em um até o máximo de 25 (de cima)
"30" indica a margem que é levada em consideração para a aplicação do desfoque. Portanto, aumentar isso faz com que o desfoque respeite mais o ambiente. Aumentar esse valor também resolve o erro da mensagem de texto, comoInvalid chroma radius value 21, must be >= 0 and <= 20
Ao executá-lo, deve-se obter uma saída como a seguinte (ela é gravada em um arquivo que pode ser executado e impresso na saída que pode ser copiada e executada):
Unrecognized option 'filter_complex[0:v]crop=200:200:60:30,boxblur=10[fg];[0:v][fg]overlay=60:30[v]-map [v] -map 0:a -c:v libx264 -c:a copy -movflags +faststart output.mp4'. Error splitting the argument list: Option not found
ffmpeg -i input.mp4 -filter_complex "[0:v]crop=200:200:60:30,boxblur=10[fg]; [0:v][fg]overlay=60:30[v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy -movflags +faststart output.mp4
No caso de alguém não gostar da borda afiada do embaçamento, criei um script que envolve diferentes estágios do embaçamento, para que a borda não fique afiada e fique assim:
Em vez disso:
É um script python:
Você pode alterar os parâmetros na última e na penúltima linha, os dois últimos parâmetros entre aspas são o caminho para o seu vídeo e o vídeo de saída (supondo que eles estejam no diretório de trabalho). Na penúltima linha:
Invalid chroma radius value 21, must be >= 0 and <= 20
Ao executá-lo, deve-se obter uma saída como a seguinte (ela é gravada em um arquivo que pode ser executado e impresso na saída que pode ser copiada e executada):
fonte