FFmpeg-얼굴에 흐림 효과 적용


25

FFmpeg를 사용하여 비디오의 일부를 흐리게하려고합니다 (특히 얼굴을 흐리게하기 위해).

타임 라인 편집과 다양한 블러 링 필터를 조합하여 사용하려고했지만 비디오의 일부만 블러 링하는 방법을 찾을 수 없습니다.

나는 다음과 같은 것을 바라고있다 :

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

여기서 width/ height는 흐린 상자의 크기이고 x/ y는 흐린 상자의 위치입니다.

이와 같은 것이 가능합니까?

답변:


33

블러 링하려는 영역이 정적 위치라고 가정하면 세그먼트 및 섹션에 시간적 및 공간적 블러 링을 적용 할 수 있습니다.

검은 실험실 강아지
원래 검은 실험실 강아지 이미지.

마스크 이미지 사용

여기에 이미지 설명을 입력하십시오여기에 이미지 설명을 입력하십시오
회색조 PNG 마스크 이미지 및 결과적으로 흐린 이미지.

회색조 마스크 이미지를 만들어 흐림 영역을 표시 할 수 있습니다. 사용하기 쉽도록 흐리게하려는 이미지 또는 비디오와 크기가 같아야합니다.

alphamerge , boxbluroverlay 사용 예 :

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

참고 : 오버레이 ( 6030이 예에서) 의 x 및 y 오프셋 숫자 는 자르기 오프셋과 일치해야합니다.

이 예제의 기능 :

  1. 흐리게 처리 할 영역의 크기가되도록 사본을 자릅니다. 이 예에서는 오른쪽 상단에서 60 픽셀 , 왼쪽 상단에서 x30 픽셀 아래 ( y축) 인 200x200 픽셀 상자입니다 .
  2. 자른 부분을 흐리게합니다.
  3. 동일한 영역을 흐리게하여 오버레이 xy로부터 파라미터 작물 필터.

특정 영역에 여러 번 흐림 효과 (마스크 제외)

여기에 이미지 설명을 입력하십시오
왼쪽 상단, 중앙 및 하단에 흐린 부분이 있습니다.

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

추가 물건


답변 해 주셔서 감사합니다. 모든 것이 의미가 있습니다. 부수적으로, 그것은 또한 split 필터가 마침내 의미를 갖도록 만들었다! 또한 산술 표현식을 통해 이미지 주위의 흐릿한 상자를 동적으로 이동할 수 있습니까? 비선형 방식으로 움직일 때 누군가의 얼굴을 흐리게하기위한 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
Jim

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

블러 링의 날카로운 가장자리를 싫어하는 경우, 다른 블러 링 단계를 겹쳐서 가장자리가 선명하지 않고 다음과 같이 보이는 스크립트를 만들었습니다.부드럽게 _blurred_image

이 대신에 :원본 이미지

파이썬 스크립트입니다.

#!/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 픽셀 더 넓어야 함을 나타냅니다.
  • 두 번째 "1"은 흐림이 최대 25까지 (위에서)까지 1 씩 증가해야 함을 나타냅니다.
  • "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

@Gyan 무슨 뜻인가요? 나는 이미 그렇게하고 있다고 생각합니다.
sup

어쨌든, 나는 코드를 더 향상 시켰지만 여전히 내가 권장하는 것을하고 있는지 확실하지 않습니다.
sup
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.