Существует ли способ на Python для выбора уникальных кадров из видео?

Как можно на Python реализовать извлечение уникальных кадров (скриншотов) из видео, при этом учитывая, что выбранные кадры должны отличаться друг от друга более чем на 50%?
  • 1 февраля 2025 г. 23:14
Ответы на вопрос 1
Да, вы можете использовать Python для извлечения уникальных кадров из видео. Для этой задачи можно использовать библиотеки `OpenCV` для обработки видео и `imagehash` для сравнения изображений.

Вот пример, как это можно реализовать:

1. Установите необходимые библиотеки, если они еще не установлены:

```bash
pip install opencv-python imagehash Pillow
```

2. Используйте следующий код для извлечения уникальных кадров:

```python
import cv2
import imagehash
from PIL import Image
import numpy as np

def get_unique_frames(video_path, threshold=0.5):
    # Открываем видео
    cap = cv2.VideoCapture(video_path)
    
    # Для хранения уникальных кадров
    unique_frames = []
    
    # Считываем первый кадр
    ret, previous_frame = cap.read()
    if not ret:
        print("Не удалось прочитать видео.")
        return unique_frames

    previous_hash = imagehash.average_hash(Image.fromarray(previous_frame))

    while True:
        # Считываем следующий кадр
        ret, frame = cap.read()
        if not ret:
            break
        
        # Вычисляем хеш текущего кадра
        current_hash = imagehash.average_hash(Image.fromarray(frame))
        
        # Вычисляем расстояние Хэмминга между хешами
        difference = previous_hash - current_hash
        
        # Если разница больше заданного порога, считаем кадр уникальным
        if difference / len(previous_hash.hash) ** 2 > threshold:
            unique_frames.append(frame)
            previous_hash = current_hash

    cap.release()
    
    return unique_frames

# Использование функции
video_path = 'path_to_your_video.mp4'
unique_frames = get_unique_frames(video_path)

# Сохраняем уникальные кадры
for i, frame in enumerate(unique_frames):
    cv2.imwrite(f'unique_frame_{i}.jpg', frame)

print(f'Извлечено {len(unique_frames)} уникальных кадров')
```

### Объяснение кода:
- Мы открываем видеофайл и читаем кадры с помощью OpenCV.
- Для каждого кадра вычисляем средний хеш с помощью библиотеки `imagehash`.
- Сравниваем хеш текущего кадра с предыдущим. Если расстояние Хэмминга превышает порог (50% различия), то добавляем кадр в список уникальных кадров.
- В конце сохраняем уникальные кадры в файлы.

### Примечание:
- Вы можете изменять значение `threshold` в зависимости от ваших потребностей. Значение `0.5` означает, что кадры должны отличаться на 50% по хешу.
- Обратите внимание, что алгоритм может быть адаптирован под разные задачи. Например, можно использовать другие методы сравнения изображений.
Похожие вопросы