FFmpeg - Áp dụng làm mờ trên khuôn mặt


25

Tôi đang cố làm mờ một phần video bằng FFmpeg (cụ thể là làm mờ khuôn mặt).

Tôi đã cố gắng sử dụng kết hợp chỉnh sửa dòng thời gian và các bộ lọc làm mờ khác nhau, nhưng tôi không thể tìm cách làm mờ chỉ một phần của video.

Tôi đang hy vọng một cái gì đó như:

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

Trong đó width/ heightlà kích thước của hộp mờ và x/ ylà vị trí của hộp mờ.

Có phải bất cư thứ gì như thế này đều được?

Câu trả lời:


33

Có thể áp dụng làm mờ tạm thời và không gian cho một đoạn / phần - giả sử khu vực bạn muốn làm mờ là một vị trí tĩnh.

Học sinh phòng thí nghiệm đen
Hình ảnh con nhộng phòng thí nghiệm màu đen.

Sử dụng hình ảnh mặt nạ

nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây
Hình ảnh mặt nạ PNG màu xám và kết quả là hình ảnh bị mờ.

Bạn có thể tạo một hình ảnh mặt nạ thang độ xám để chỉ ra khu vực bị mờ. Để dễ sử dụng, nó phải có cùng kích thước với hình ảnh hoặc video bạn muốn làm mờ.

Ví dụ sử dụng 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
  • Vùng trắng là nơi sẽ xuất hiện hiện tượng mờ, nhưng điều này có thể dễ dàng đảo ngược với bộ lọc phủ định:[1:v]negate[mask];[0:v][mask]alphamerge,boxblur=10[alf]...

  • Bạn có thể sử dụng bộ lọc geq để tạo mặt nạ như độ dốc.

Làm mờ vùng cụ thể (không có mặt nạ)

Đen lab con với hiệu ứng mờ

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

Lưu ý: Các số bù x và y trong lớp phủ ( 6030trong ví dụ này) phải khớp với các độ lệch crop.

Ví dụ này làm gì:

  1. Cắt bản sao để có kích thước của khu vực được làm mờ. Trong ví dụ này: một hộp 200x200 pixel là 60 pixel ở bên phải ( xtrục) và 30 pixel xuống ( ytrục) từ góc trên cùng bên trái.
  2. Làm mờ vùng bị cắt.
  3. Lớp phủ vùng bị mờ bằng cách sử dụng cùng xycác tham số từ bộ lọc crop .

Nhiều vết mờ trên các khu vực cụ thể (không có mặt nạ)

nhập mô tả hình ảnh ở đây
Các khu vực mờ ở trên cùng bên trái, gần trung tâm và dưới cùng.

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

Khu vực cụ thể không bị mờ (không có mặt nạ)

nhập mô tả hình ảnh ở đây

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

Công cụ bổ sung


Cảm ơn rất nhiều vì bạn đã trả lời. Đó là tất cả có ý nghĩa lớn. Như một lưu ý phụ, nó cũng làm cho bộ lọc phân chia có ý nghĩa cuối cùng! Ngoài ra, có thể thông qua các biểu thức số học để tự động di chuyển hộp mờ xung quanh hình ảnh? IE với mục đích làm mờ khuôn mặt của ai đó khi họ di chuyển theo kiểu phi tuyến tính?
constvtech

Cảm ơn một lần nữa! Tôi sẽ có một vết nứt tại nó. Tôi biết rằng trình chỉnh sửa phi tuyến tính sẽ dễ dàng hơn 1000 lần ở đây, nhưng tôi hy vọng sẽ xử lý hàng loạt nhiều tệp và không muốn chờ đợi trong quá trình nhập / nhập khung / khóa. Cảm ơn một lần nữa!
constvtech

1
FFMPEG có cung cấp các hình dạng khác ngoài các hộp, chẳng hạn như hình tròn không?
CN

@LordNeckbeard Tôi đang sử dụng cmd và tôi muốn sử dụng Ví dụ 1 nhưng khi tôi thực thi mã, tôi gặp lỗi nàyUnrecognized 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 Tôi nhận thấy rằng lệnh ví dụ của tôi bị thiếu một trích dẫn. Lệnh của bạn sẽ trông giống như thế này: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

Đối với trường hợp khi người ta không thích cạnh sắc nét của mờ, tôi đã tạo một kịch bản phân lớp các giai đoạn làm mờ khác nhau để cạnh không sắc nét và trông như thế này:Softly_blurr_image

Thay vì điều này:Ảnh gốc

Đây là một kịch bản 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")

Bạn có thể thay đổi các tham số trong dòng cuối cùng và áp chót, hai tham số cuối cùng giữa các dấu quatation là đường dẫn đến video của bạn và video đầu ra (giả sử chúng được đặt trong thư mục làm việc). Trong dòng áp chót:

  • hai số đầu tiên cho biết kích thước của khu vực ban đầu sẽ được áp dụng độ mờ tối đa,
  • hai thứ hai chỉ ra tọa độ x và y của chúng,
  • hai phần ba chỉ thời gian tính bằng giây khi áp dụng làm mờ
  • "25" trong ví dụ này chỉ ra rằng sẽ có 25 hộp được áp dụng chồng lên nhau)
  • "1" tiếp theo chỉ ra rằng các hộp lớn hơn với độ mờ ít hơn nên chỉ rộng hơn một pixel so với người tiền nhiệm của chúng
  • "1" thứ hai chỉ ra rằng độ mờ sẽ tăng thêm một cho đến khi tối đa là 25 (từ trên)
  • "30" biểu thị lề được xem xét để áp dụng độ mờ, do đó, việc tăng này làm cho độ mờ càng tôn trọng xung quanh. Tăng giá trị này cũng giải quyết lỗi được nhắn tin nhưInvalid chroma radius value 21, must be >= 0 and <= 20

Bằng cách chạy nó, người ta sẽ nhận được một đầu ra như sau (nó được ghi vào filethat có thể được chạy và in trên đầu ra có thể được sao chép và chạy):

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

Nếu bất cứ ai biết về một cách dễ dàng hơn để đạt được các cạnh blury, tôi sẽ quan tâm. Ngoài ra, điều này là khá chậm.
sup

Áp dụng một hộp mờ cho mặt nạ trước khi hợp nhất nó.
Gyan

@Gyan Ý bạn là gì? Tôi nghĩ rằng tôi đang làm điều đó rồi.
sup

Dù sao, tôi đã cải thiện mã hơn nữa, tôi vẫn không chắc chắn tôi đang làm những gì bạn đề nghị.
sup
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.