Цель:
- Декодировать кадры → применить фиксированную маску → закрасить замаскированную область → перекодировать видео.
- Сохранять стабильность вывода во всех кадрах (избегать мерцания).
- Предпочитаю быстрое решение достаточно для пакетной обработки
- Ввод: H.264 MP4, 1080p, 30 кадров в секунду, длительность ~10 с.
- Область водяного знака (фиксированная): x=1600, y=900, w=280, h=120 (пример)
- Логотип в основном непрозрачный, иногда с полупрозрачными краями.
Я использовал FFmpeg для извлечения кадров, затем OpenCV для покадровой отрисовки.
Извлечение кадров FFmpeg:
Код: Выделить всё
ffmpeg -i input.mp4 -vsync 0 frames/%06d.png
Код: Выделить всё
import cv2
import numpy as np
x, y, w, h = 1600, 900, 280, 120
img = cv2.imread("frames/000001.png")
mask = np.zeros(img.shape[:2], dtype=np.uint8)
mask[y:y+h, x:x+w] = 255
result = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
cv2.imwrite("out/000001.png", result)
Код: Выделить всё
ffmpeg -framerate 30 -i out/%06d.png -c:v libx264 -pix_fmt yuv420p output.mp4
Покадровая зарисовка работает нормально на отдельных изображениях, но в видео закрашенная область мерцает, потому что реконструкция немного меняется в зависимости от кадра (особенно вдоль краев/текстур).
Вопросы
- Какой рекомендуемый подход к уменьшению мерцания при удалении логотипа фиксированной области?
Есть ли известный метод распространения реконструкции во времени (например, управление оптическим потоком, временное сглаживание)? - При использовании только OpenCV: какой минимальный инженерный подход (без обучения модели) обеспечивает согласованность результатов?
Пример: следует ли мне рисовать на ключевом кадре, а затем отслеживать/деформировать патч с помощью оптического потока? - Есть ли собственный способ сделать это в FFmpeg лучше, чем извлечение кадров (например, delogo + что-то еще) или OpenCV — правильный путь?
Подробнее здесь: https://stackoverflow.com/questions/798 ... peg-opencv