FFmpeg - Verwischen Sie das Gesicht

25

Ich versuche, einen Teil eines Videos mit FFmpeg zu verwischen (speziell, um ein Gesicht zu verwischen).

Ich habe versucht, eine Kombination aus Timeline-Bearbeitung und den verschiedenen Weichzeichnungsfiltern zu verwenden, finde jedoch keine Möglichkeit, nur einen Teil des Videos zu verwischen.

Ich hoffe auf etwas wie:

-vf boxblur=enable='between(t,10,100)':width=20:height=20:x=400:y=200

Wo width/ heightist die Größe der unscharfen Box und x/ yoder wo befindet sich die unscharfe Box ?

Ist so etwas möglich?

occvtech
quelle

Antworten:

33

Es ist möglich, zeitliche und räumliche Unschärfen auf ein Segment / einen Abschnitt anzuwenden - vorausgesetzt, der Bereich, den Sie verwischen möchten, ist ein statischer Ort.

Schwarzer Labwelpe
Ursprüngliches schwarzes Laborwelpenbild.

Maskenbild verwenden

Bildbeschreibung hier eingebenBildbeschreibung hier eingeben
Graustufen-PNG-Maskenbild und daraus resultierendes unscharfes Bild.

Sie können ein Graustufenmaskenbild erstellen, um den zu verwischenden Bereich anzugeben. Zur Erleichterung der Verwendung sollte es die gleiche Größe haben wie das Bild oder Video, das Sie verwischen möchten.

Beispiel mit Alphamerge , Boxblur und Overlay :

ffmpeg -i video.mp4 -i mask.png -filter_complex "[0:v][1:v]alphamerge,boxblur=10[alf];[0:v][alf]overlay[v]" -map "[v]" -map 0:a -c:v libx264 -c:a copy -movflags +faststart maskedblur.mp4
  • Der weiße Bereich ist der Ort, an dem die Unschärfe auftritt. Dies kann jedoch leicht mit dem Negativfilter umgekehrt werden. Beispiel:[1:v]negate[mask];[0:v][mask]alphamerge,boxblur=10[alf]...

  • Sie können den Geq- Filter verwenden, um eine Maske wie einen Farbverlauf zu generieren.

Bereich verwischen (ohne Maske)

Schwarzer Laborwelpe mit Unschärfeeffekt

ffmpeg -i derpdog.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 derpdogblur.mp4

Hinweis: Die x- und y-Versatznummern in der Überlagerung ( 60und 30in diesem Beispiel) müssen mit den Zuschnittsversätzen übereinstimmen.

Was dieses Beispiel bewirkt:

  1. Beschneiden Sie die Kopie auf die Größe des zu unscharfen Bereichs. In diesem Beispiel: Ein 200 x 200 Pixel großes Feld, das 60 Pixel rechts ( xAchse) und 30 Pixel unten ( yAchse) von der oberen linken Ecke entfernt ist.
  2. Verwischen Sie den zugeschnittenen Bereich.
  3. Überlagern Sie den unscharfen Bereich mit denselben xund yParametern aus dem Zuschneidefilter .

Mehrere Unschärfen über bestimmte Bereiche (ohne Maske)

Bildbeschreibung hier eingeben
Unscharfe Bereiche oben links, nahe der Mitte und unten.

"[0:v]crop=50:50:20:10,boxblur=10[b0]; \
 [0:v]crop=iw:30:(iw-ow)/2:ih-oh,boxblur=10[b1]; \
 [0:v]crop=100:100:120:80,boxblur=10[b2]; \
 [0:v][b0]overlay=20:10[ovr0]; \
 [ovr0][b1]overlay=(W-w)/2:H-h[ovr1]; \
 [ovr1][b2]overlay=120:80"

Bestimmter Bereich nicht unscharf (ohne Maske)

Bildbeschreibung hier eingeben

"[0:v]boxblur=10[bg];[0:v]crop=200:200:60:30[fg];[bg][fg]overlay=60:30"

Zusätzliches Zeug

Logan
quelle
Vielen Dank für Ihre Antwort. Das alles macht großen Sinn. Als Randnotiz machte es auch den geteilten Filter endlich Sinn! Könnte es auch möglich sein, durch arithmetische Ausdrücke den unscharfen Rahmen dynamisch um das Bild zu bewegen? IE für den Zweck, jemandes Gesicht zu verwischen, wenn er sich nicht linear bewegt?
Occvtech
Danke noch einmal! Ich werde es versuchen. Ich weiß, dass ein nichtlinearer Editor hier 1000-mal einfacher wäre, aber ich hoffe, dass ich mehrere Dateien stapelweise verarbeiten kann und nicht auf den Import- / Keyframe- / Exportprozess warten möchte. Danke noch einmal!
Occvtech
1
Bietet FFMPEG neben Kästchen auch andere Formen wie Kreise an?
So,
@ LordNeckbeard Ich verwende cmd und ich möchte Beispiel 1 verwenden, aber wenn ich den Code ausführe, erhalte ich diesen FehlerUnrecognized 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 Mir ist aufgefallen, dass in meinem Beispielbefehl ein Anführungszeichen fehlt. Ihr Befehl sollte 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
ungefähr
0

Für den Fall, dass man die scharfe Kante der Unschärfe nicht mag, habe ich ein Skript erstellt, das verschiedene Stufen der Unschärfe überlagert, sodass die Kante nicht scharf ist und so aussieht:Weiches_ unscharfes_Bild

An Stelle von:Original Bild

Es ist ein Python-Skript:

#!/usr/bin/env python3
import os,stat
def blur_softly(matrix,video_in="video_to_be_blurred.mp4",video_out=""):
    if video_out == "":
        video_out = video_in[:-4] + "_blurred" + video_in[-4:]
    s0 = "ffmpeg -i " + video_in + " -filter_complex \\\n\"[0:v]null[v_int0]; \\\n"
    s1 = ''
    a = 0
    for m in matrix:
        blur = m[6]
        multiple = m[7]
        width = m[0]+blur*multiple*2
        height = m[1]+blur*multiple*2
        x_cord = m[2]-blur*multiple
        y_cord = m[3]-blur*multiple
        timein = m[4]
        timeout = m[5]
        step = m[8]
        margin = m[9]
        for i in range(blur):
            ii = multiple*i
            s0 = s0 + "[v_int0]crop="+str(width-2*ii+(margin//2)*2)+":"+str(height-2*ii+(margin//2)*2)+":"+str(x_cord+ii-margin//2)+":"+str(y_cord+ii-margin//2) + \
            ",boxblur="+str((i+1)*step)+":enable='between(t,"+str(timein)+","+str(timeout)+ \
            ")',crop="+str(width-2*ii)+ ":"+str(height-2*ii)+":"+str(margin//2)+":"+str(margin//2)+ "[blur_int" + str(i+1+a)+"]; \\\n"
            s1 = s1 + "[v_int"+ str(i+a) +"][blur_int"+str(i+a+1)+"]overlay="+str(x_cord+ii)+":"+str(y_cord+ii)+":enable='between(t,"+str(timein)+","+str(timeout)+ ")'[v_int"+str(i+a+1)+"]; \\\n"
        a += i+1
    s = s0 + s1 + "[v_int"+str(a)+"]null[with_subtitles]\" \\\n-map \"[with_subtitles]\" -map 0:a -c:v libx264 -c:a copy -crf 17 -preset slow -y "+video_out+"\n"
    print(s)
    file_object = open('blur.sh', 'w')
    file_object.write(s)
    file_object.close()
    st = os.stat('blur.sh')
    os.chmod('blur.sh', st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
#w,h,x,y,timein,timeout,blur,multiple,step,margin
matrix = [[729,70,599,499,14.96,16.40,25,1,1,90],]
blur_softly(matrix,video_in="your_video.mp4",video_out="output_video.mp4")

Sie können die Parameter in der letzten und vorletzten Zeile ändern. Die letzten beiden Parameter zwischen den Anführungszeichen sind der Pfad zu Ihrem Video und das Ausgabevideo (vorausgesetzt, sie befinden sich im Arbeitsverzeichnis). In der vorletzten Zeile:

  • Die ersten beiden Zahlen geben die Größe des Anfangsbereichs an, auf den die maximale Unschärfe angewendet wird.
  • die zweiten beiden geben die x- und y-Koordinaten an,
  • Die dritten beiden geben die Zeiten in Sekunden an, zu denen die Unschärfe angewendet werden soll.
  • "25" in diesem Beispiel bedeutet, dass 25 Kästchen übereinander angebracht werden.)
  • Die nächste "1" gibt an, dass größere Kästchen mit weniger Unschärfe nur ein Pixel breiter sein sollten als ihre Vorgänger
  • Die zweite "1" gibt an, dass die Unschärfe um eins bis maximal 25 (von oben) zunehmen soll.
  • "30" gibt den Rand an, der beim Anwenden der Unschärfe berücksichtigt wird. Wenn Sie also den Rand erhöhen, wird die Unschärfe stärker auf die Umgebung abgestimmt. Wenn Sie diesen Wert erhöhen, wird auch ein Fehler behoben, der wie folgt lautetInvalid chroma radius value 21, must be >= 0 and <= 20

Wenn Sie es ausführen, sollten Sie eine Ausgabe wie die folgende erhalten (es wird in eine Datei geschrieben, die ausgeführt und auf der Ausgabe gedruckt werden kann, die kopiert und ausgeführt werden kann):

ffmpeg -i video_to_be_blurred.mp4 -filter_complex \
"[0:v]null[v_int0]; \
[v_int0]crop=869:210:529:429,boxblur=1:enable='between(t,14.96,16.4)',crop=779:120:45:45[blur_int1]; \
[v_int0]crop=867:208:530:430,boxblur=2:enable='between(t,14.96,16.4)',crop=777:118:45:45[blur_int2]; \
[v_int0]crop=865:206:531:431,boxblur=3:enable='between(t,14.96,16.4)',crop=775:116:45:45[blur_int3]; \
[v_int0]crop=863:204:532:432,boxblur=4:enable='between(t,14.96,16.4)',crop=773:114:45:45[blur_int4]; \
[v_int0]crop=861:202:533:433,boxblur=5:enable='between(t,14.96,16.4)',crop=771:112:45:45[blur_int5]; \
[v_int0]crop=859:200:534:434,boxblur=6:enable='between(t,14.96,16.4)',crop=769:110:45:45[blur_int6]; \
[v_int0]crop=857:198:535:435,boxblur=7:enable='between(t,14.96,16.4)',crop=767:108:45:45[blur_int7]; \
[v_int0]crop=855:196:536:436,boxblur=8:enable='between(t,14.96,16.4)',crop=765:106:45:45[blur_int8]; \
[v_int0]crop=853:194:537:437,boxblur=9:enable='between(t,14.96,16.4)',crop=763:104:45:45[blur_int9]; \
[v_int0]crop=851:192:538:438,boxblur=10:enable='between(t,14.96,16.4)',crop=761:102:45:45[blur_int10]; \
[v_int0]crop=849:190:539:439,boxblur=11:enable='between(t,14.96,16.4)',crop=759:100:45:45[blur_int11]; \
[v_int0]crop=847:188:540:440,boxblur=12:enable='between(t,14.96,16.4)',crop=757:98:45:45[blur_int12]; \
[v_int0]crop=845:186:541:441,boxblur=13:enable='between(t,14.96,16.4)',crop=755:96:45:45[blur_int13]; \
[v_int0]crop=843:184:542:442,boxblur=14:enable='between(t,14.96,16.4)',crop=753:94:45:45[blur_int14]; \
[v_int0]crop=841:182:543:443,boxblur=15:enable='between(t,14.96,16.4)',crop=751:92:45:45[blur_int15]; \
[v_int0]crop=839:180:544:444,boxblur=16:enable='between(t,14.96,16.4)',crop=749:90:45:45[blur_int16]; \
[v_int0]crop=837:178:545:445,boxblur=17:enable='between(t,14.96,16.4)',crop=747:88:45:45[blur_int17]; \
[v_int0]crop=835:176:546:446,boxblur=18:enable='between(t,14.96,16.4)',crop=745:86:45:45[blur_int18]; \
[v_int0]crop=833:174:547:447,boxblur=19:enable='between(t,14.96,16.4)',crop=743:84:45:45[blur_int19]; \
[v_int0]crop=831:172:548:448,boxblur=20:enable='between(t,14.96,16.4)',crop=741:82:45:45[blur_int20]; \
[v_int0]crop=829:170:549:449,boxblur=21:enable='between(t,14.96,16.4)',crop=739:80:45:45[blur_int21]; \
[v_int0]crop=827:168:550:450,boxblur=22:enable='between(t,14.96,16.4)',crop=737:78:45:45[blur_int22]; \
[v_int0]crop=825:166:551:451,boxblur=23:enable='between(t,14.96,16.4)',crop=735:76:45:45[blur_int23]; \
[v_int0]crop=823:164:552:452,boxblur=24:enable='between(t,14.96,16.4)',crop=733:74:45:45[blur_int24]; \
[v_int0]crop=821:162:553:453,boxblur=25:enable='between(t,14.96,16.4)',crop=731:72:45:45[blur_int25]; \
[v_int0][blur_int1]overlay=574:474:enable='between(t,14.96,16.4)'[v_int1]; \
[v_int1][blur_int2]overlay=575:475:enable='between(t,14.96,16.4)'[v_int2]; \
[v_int2][blur_int3]overlay=576:476:enable='between(t,14.96,16.4)'[v_int3]; \
[v_int3][blur_int4]overlay=577:477:enable='between(t,14.96,16.4)'[v_int4]; \
[v_int4][blur_int5]overlay=578:478:enable='between(t,14.96,16.4)'[v_int5]; \
[v_int5][blur_int6]overlay=579:479:enable='between(t,14.96,16.4)'[v_int6]; \
[v_int6][blur_int7]overlay=580:480:enable='between(t,14.96,16.4)'[v_int7]; \
[v_int7][blur_int8]overlay=581:481:enable='between(t,14.96,16.4)'[v_int8]; \
[v_int8][blur_int9]overlay=582:482:enable='between(t,14.96,16.4)'[v_int9]; \
[v_int9][blur_int10]overlay=583:483:enable='between(t,14.96,16.4)'[v_int10]; \
[v_int10][blur_int11]overlay=584:484:enable='between(t,14.96,16.4)'[v_int11]; \
[v_int11][blur_int12]overlay=585:485:enable='between(t,14.96,16.4)'[v_int12]; \
[v_int12][blur_int13]overlay=586:486:enable='between(t,14.96,16.4)'[v_int13]; \
[v_int13][blur_int14]overlay=587:487:enable='between(t,14.96,16.4)'[v_int14]; \
[v_int14][blur_int15]overlay=588:488:enable='between(t,14.96,16.4)'[v_int15]; \
[v_int15][blur_int16]overlay=589:489:enable='between(t,14.96,16.4)'[v_int16]; \
[v_int16][blur_int17]overlay=590:490:enable='between(t,14.96,16.4)'[v_int17]; \
[v_int17][blur_int18]overlay=591:491:enable='between(t,14.96,16.4)'[v_int18]; \
[v_int18][blur_int19]overlay=592:492:enable='between(t,14.96,16.4)'[v_int19]; \
[v_int19][blur_int20]overlay=593:493:enable='between(t,14.96,16.4)'[v_int20]; \
[v_int20][blur_int21]overlay=594:494:enable='between(t,14.96,16.4)'[v_int21]; \
[v_int21][blur_int22]overlay=595:495:enable='between(t,14.96,16.4)'[v_int22]; \
[v_int22][blur_int23]overlay=596:496:enable='between(t,14.96,16.4)'[v_int23]; \
[v_int23][blur_int24]overlay=597:497:enable='between(t,14.96,16.4)'[v_int24]; \
[v_int24][blur_int25]overlay=598:498:enable='between(t,14.96,16.4)'[v_int25]; \
[v_int25]null[with_subtitles]" \
-map "[with_subtitles]" -map 0:a -c:v libx264 -c:a copy -crf 17 -slow preset -y video_to_be_blurred_blurred.mp4
sup
quelle
Wenn jemand einen einfacheren Weg kennt, um unscharfe Kanten zu erzielen, wäre ich interessiert. Auch das ist eher langsam.
Sonntag,
Wenden Sie eine Rahmenunschärfe auf die Maske an, bevor Sie sie zusammenführen.
Gyan
@ Gyan Was meinst du? Ich glaube, das mache ich schon.
sup
Wie auch immer, ich habe den Code weiter verbessert. Ich bin mir immer noch nicht sicher, ob ich das tue, was Sie empfohlen haben.
sup