ffmpeg desenha uma linha de ponto a ponto

0

Estou precisando desenhar uma linha de ponto a ponto no ffmpeg. Eu não vejo um filtro drawline no ffmpeg, então eu diria que drawbox precisaria ser usado (veja o comando abaixo). Como eu poderia adaptar isso para desenhar uma linha diagonal de, digamos, 10,10 a 500,500 ?

Eu usei o teorema de Pitágoras para calcular o quão "larga" a linha precisa ser, mas isso é o máximo que eu consegui:

ffmpeg -i input.mp4 -vf drawbox=x=10:y=10:w=692:h=1:color=red output.mp4

Obrigado

    
por user1661677 04.11.2016 / 17:44

1 resposta

2

Neste caso específico, como a linha está em 45%, podemos usar o método abaixo.

ffmpeg -i in.mp4 -filter_complex 
      "color=red:s=490x490,geq=lum='p(X,Y))':a='if(eq(X,Y),255,0)'[c];
       [0][c]overlay=10:10:shortest=1"
out.mp4

Os filtros GEQ permitem manipular pixels individuais usando expressões. Se uma linha estiver em 45 graus, isso significa que todos os pontos estão na linha X = Y ou X = -Y . O último caso é irrelevante aqui.

Então, primeiro uma tela em branco é criada. Seu tamanho é a cobertura necessária para desenhar a linha inteira (W = 500-10; H = 500-10). Em seguida, o GEQ define todos os pixels com X = Y como opacos, mas todos os outros como transparentes. (A expressão lum é necessária devido a um capricho do design do filtro; tudo o que ele faz é reter o valor existente dos três planos - luma e dois croma).

Então esta saída é sobreposta com um deslocamento de (10,10). O mais curto é necessário porque a entrada de cor / geq nunca termina.

Para o caso geral de uma linha em um grau arbitrário, desenhe uma linha reta, ou seja, mantenha alfa de 255 para uma única linha, ou seja, 'if(eq(Y,100),255,0)' e use o filtro giratório para obtê-lo no ângulo correto. (O preenchimento rotacionado deve ser fillcolor=anycolor@0 ). Em seguida, sobreponha isso.

    
por 04.11.2016 / 20:30

Tags