FFmpeg - Oleskan blur pada wajah

25

Saya mencoba mengaburkan sebagian video menggunakan FFmpeg (khusus untuk mengaburkan wajah).

Saya telah mencoba menggunakan kombinasi pengeditan waktu dan berbagai filter blur, tetapi saya tidak dapat menemukan cara untuk mengaburkan hanya sebagian dari video.

Saya berharap untuk sesuatu seperti:

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

Dimana width/ heightadalah ukuran kotak kabur dan x/ yadalah lokasi dari kotak kabur.

Apakah hal seperti ini mungkin?

occvtech
sumber

Jawaban:

33

Dimungkinkan untuk menerapkan pengaburan temporal dan spasial ke segmen / bagian - dengan asumsi area yang ingin Anda blur adalah lokasi statis.

Anak anjing lab hitam
Gambar anak anjing lab hitam asli.

Menggunakan gambar topeng

masukkan deskripsi gambar di sinimasukkan deskripsi gambar di sini
Gambar topeng PNG skala abu-abu dan menghasilkan gambar buram.

Anda dapat membuat gambar topeng abu-abu untuk menunjukkan area yang akan buram. Untuk kemudahan penggunaan, ukurannya harus sama dengan gambar atau video yang ingin Anda blur.

Contoh menggunakan alphamerge , boxblur , dan 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
  • Area putih adalah tempat terjadinya blur, tetapi ini dapat dengan mudah dibalik dengan filter negate misalnya:[1:v]negate[mask];[0:v][mask]alphamerge,boxblur=10[alf]...

  • Anda bisa menggunakan filter geq untuk menghasilkan topeng seperti gradien.

Mengaburkan area tertentu (tanpa topeng)

Anak anjing lab hitam dengan efek blur

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

Catatan: Angka offset x dan y dalam overlay ( 60dan 30dalam contoh ini) harus cocok dengan offset pemotongan.

Apa yang dilakukan contoh ini:

  1. Pangkas salinan menjadi ukuran area yang akan dikaburkan. Dalam contoh ini: kotak 200x200 piksel yang 60 piksel ke kanan ( xsumbu) dan 30 piksel ke bawah ( ysumbu) dari sudut kiri atas.
  2. Memburamkan area yang dipangkas.
  3. Overlay area yang kabur menggunakan parameter yang sama xdan ydari filter crop .

Banyak buram pada area tertentu (tanpa topeng)

masukkan deskripsi gambar di sini
Area buram di kiri atas, dekat tengah, dan bawah.

"[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"

Area spesifik tidak kabur (tanpa topeng)

masukkan deskripsi gambar di sini

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

Hal-hal tambahan

llogan
sumber
Terima kasih banyak atas tanggapan Anda. Itu semua masuk akal. Sebagai catatan, itu juga membuat filter perpecahan masuk akal akhirnya! Juga, mungkinkah melalui ekspresi aritmatika untuk secara dinamis memindahkan kotak kabur di sekitar gambar? Apakah dengan maksud untuk mengaburkan wajah seseorang ketika mereka bergerak secara non-linear?
occvtech
Terima kasih lagi! Saya akan mengambil celah itu. Saya tahu bahwa editor non-linear akan 1000 kali lebih mudah di sini, tetapi saya berharap untuk mengelompokkan beberapa file dan tidak ingin menunggu melalui proses impor / bingkai kunci / ekspor. Terima kasih lagi!
occvtech
1
apakah FFMPEG menawarkan bentuk lain selain kotak, seperti lingkaran?
Sun
@ LordNeckbeard Saya menggunakan cmd dan saya ingin menggunakan Contoh 1 tetapi ketika saya menjalankan kode saya mendapatkan kesalahan iniUnrecognized 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 Saya perhatikan bahwa perintah contoh saya tidak ada kutipan. Perintah Anda harus terlihat seperti ini: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

Untuk kasus ketika seseorang tidak menyukai ujung tajam dari kabur, saya membuat skrip yang melapisi berbagai tahapan kabur sehingga ujungnya tidak tajam dan terlihat seperti ini:Gambar Softly_blurred_

Alih-alih ini:Gambar asli

Ini adalah skrip python:

#!/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")

Anda dapat mengubah parameter di baris terakhir dan kedua dari belakang, dua parameter terakhir antara tanda quatation adalah path ke video Anda dan output video (dengan asumsi mereka ditempatkan di direktori kerja). Di garis kedua dari belakang:

  • dua angka pertama menunjukkan ukuran area awal yang akan diterapkan blur maksimum,
  • dua yang kedua menunjukkan koordinat x dan y,
  • dua yang ketiga menunjukkan waktu dalam detik ketika blur harus diterapkan,
  • "25" dalam contoh ini menunjukkan bahwa akan ada 25 kotak yang diterapkan satu sama lain)
  • "1" berikutnya menunjukkan bahwa kotak yang lebih besar dengan lebih sedikit blur seharusnya hanya satu piksel lebih lebar dari pendahulunya
  • "1" yang kedua menunjukkan bahwa pengaburan harus bertambah satu hingga maksimal 25 (dari atas)
  • "30" menunjukkan margin yang dipertimbangkan untuk menerapkan blur, sehingga meningkatkan ini membuat blur lebih menghormati sekitarnya. Meningkatkan nilai ini juga memecahkan kesalahan seperti teksInvalid chroma radius value 21, must be >= 0 and <= 20

Dengan menjalankannya, seseorang harus mendapatkan output seperti berikut (ditulis ke filethat yang dapat dijalankan dan dicetak pada output yang dapat di-copypasted dan dijalankan):

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
sumber
Jika ada yang tahu tentang cara yang lebih mudah untuk mencapai tepi kabur, saya akan tertarik. Juga, ini agak lambat.
sup
Oleskan kotak kabur ke topeng sebelum menggabungkannya.
Gyan
@Yan Apa maksudmu? Saya pikir saya sudah melakukan itu.
sup
Lagi pula, saya meningkatkan kode lebih lanjut, saya masih tidak yakin saya melakukan apa yang Anda rekomendasikan.
sup