FFmpeg - нанесіть розмиття на обличчя


25

Я намагаюся розмити частину відео за допомогою FFmpeg (конкретно, щоб розмити обличчя).

Я намагаюся використовувати поєднання редагування часової шкали та різних фільтрів розмиття, але не можу знайти спосіб розмити лише частину відео.

Я сподіваюся на щось на кшталт:

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

Де width/ heightрозмір розмитого поля та x/ yє розташування розмитого поля.

Чи можливо щось подібне?

Відповіді:


34

Можна застосувати тимчасове та просторове розмивання до сегмента / секції - якщо припустити, що область, яку ви хочете розмити, є статичним розташуванням.

Чорна лабораторія щеня
Оригінальне зображення цуценя чорної лабораторії.

Використання зображення маски

введіть тут опис зображеннявведіть тут опис зображення
Зображення у відтінках сірого PNG маскують і отримують розмиті зображення.

Ви можете створити зображення маски у відтінках сірого, щоб вказати на область розмиття. Для зручності використання він повинен бути такого ж розміру, як зображення або відео, яке ви хочете розмити.

Приклад використання алфавіту , boxblur та накладання :

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
  • Біла зона - це місце, де буде відбуватися розмиття, але це легко змінити, наприклад, за допомогою фільтра заперечення :[1:v]negate[mask];[0:v][mask]alphamerge,boxblur=10[alf]...

  • Ви можете використовувати фільтр geq для створення маски, такої як градієнт.

Розмиття певної області (без маски)

Чорний лабораторій щеня з ефектом розмиття

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

Примітка: номери зміщення x і y в накладенні ( 60і 30в цьому прикладі) повинні відповідати зрушенням обрізання.

Що робить цей приклад:

  1. Обріжте копію, щоб вона була розміром із площі, яку потрібно розмити. У цьому прикладі: вікно розміром 200x200 пікселів, яке знаходиться на 60 пікселів праворуч ( xвісь) та 30 пікселів вниз ( yвісь) у верхньому лівому куті.
  2. Розмийте обрізану ділянку.
  3. Накладіть розмиту ділянку, використовуючи те ж саме xта yпараметри з фільтру обрізання .

Багаторазове розмивання над певними ділянками (без маски)

введіть тут опис зображення
Розмиті ділянки вгорі зліва, біля центру та внизу.

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

Конкретна область не розмита (без маски)

введіть тут опис зображення

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

Додатковий матеріал


Дуже дякую за вашу відповідь. Це все має великий сенс. Як бічна примітка, він також зробив сенсорний фільтр має сенс остаточно! Також, чи можна через арифметичні вирази динамічно переміщати розмиту рамку навколо зображення? IE з метою розмити чиєсь обличчя, коли вони рухаються нелінійним способом?
occvtech

Знову дякую! Я тріскаю на це. Я знаю, що нелінійному редактору тут буде в 1000 разів простіше, але я сподіваюсь обробляти декілька файлів і не хочу чекати через імпорт / ключовий кадр / експорт. Знову дякую!
occvtech

1
чи пропонує FFMPEG інші форми, крім коробок, наприклад, кола?
Нд

@LordNeckbeard Я використовую cmd і хочу використовувати приклад 1, але коли я виконую код, я отримую цю помилку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
Джим

1
@Jim Я помітив, що в моєму прикладі команди відсутня цитата. Ваша команда повинна виглядати приблизно так: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

У випадку, коли вам не подобається гострий край розмиття, я створив сценарій, який розшаровує різні стадії розмиття, щоб край не був гострим, і це виглядає приблизно так:М'яко_бюджений_образ

Замість цього:Оригінальне зображення

Це сценарій пітона:

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

Ви можете змінювати параметри в останньому та передостанньому рядках, останні два параметри між знаками запитання - це шлях до вашого відео та вихідного відео (якщо припустимо, що вони розміщені у робочому каталозі). У передостанньому рядку:

  • перші два числа вказують розмір початкової області, до якої буде застосовано максимальне розмиття,
  • другі два вказують координати x і y,
  • треті два вказують час у секундах, коли слід застосувати розмивання,
  • "25" у цьому прикладі вказує, що буде розміщено 25 коробок один на одного)
  • наступне "1" вказує на те, що великі поля з меншим розмиттям мають бути лише на один піксель ширшими, ніж їх попередники
  • другий "1" вказує на те, що розмивання повинно збільшуватися на одиницю до тих пір, поки не перевищить 25 (зверху)
  • "30" вказує межу, яка береться до уваги при застосуванні розмиття, тому збільшуючи це, розмиття поважає більше його оточення. Збільшення цього значення також вирішує подібні помилкиInvalid chroma radius value 21, must be >= 0 and <= 20

Запустивши його, слід отримати такий висновок, як наступний (він записується до файлу, який можна запустити і надрукувати на виході, який можна скопіювати і запустити):

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

Нанесіть на маску коробку розмиття, перш ніж об’єднати її.
Джан

@Gyan Що ти маєш на увазі? Я думаю, я вже роблю це.
суп

У будь-якому разі, я вдосконалив код далі, я все ще не впевнений, що роблю те, що ти рекомендував.
sup
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.