DevGang
Авторизоваться

Как сделать слайд-шоу с помощью OpenCV

Мы сделали слайд-шоу для большинства наших презентаций в колледже / офисе, чтобы они отлично смотрелись при презентации с использованием Microsoft PowerPoint, давайте рассмотрим это как действие по обработке изображений и посмотрим, как мы можем получить утилиту слайд-шоу с помощью библиотеки OpenCV Python в этой статье.

Необходимый импорт

Сначала создайте файл python, назовите его как хотите, скажем, для этой статьи slideshow.py. Теперь добавьте в созданный файл следующие импортированные файлы:

# ./slideshow.py

import cv2
import numpy as np
from math import ceil
import os
  1. Мы импортируем cv2 для всех задач обработки изображений, numpyс псевдонимом np, чтобы создать начальное окно для отображения (все в OpenCV работает с NumPy под капотом), ceil от math чтобы удовлетворить будущему условию ( в процессе создания приложения будут моменты, когда вам придется постоянно улучшать свою программу, и это нормально, но в этой статье я хочу сохранить все в одном месте с момента запуска, так что не беспокойтесь, просто знаем, что нам понадобится этот импорт), и, наконец, мы импортируем os чтобы извлечь все файлы изображений, которые нам нужны в слайд-шоу.

Примечание. Вам также понадобится набор изображений, которые вы хотите просмотреть в виде слайд-шоу. Соберите их и храните в папке ./images и не беспокойтесь о размере изображений.

Переменные, окно изображения и альфа-бета

Добавьте в тот же файл следующий код:

dst = "./images/"       # Images destination
images = os.listdir(dst)    # Get their names in a list
length = len(images)

result = np.zeros((360,360,3), np.uint8)        # Image window of size (360, 360)
i = 1

a = 1.0     # alpha
b = 0.0     # beta
img = cv2.imread(dst + images[i])
img = cv2.resize(img, (360, 360))
  1. Первые 3 строки определяют имя изображения для всех изображений, находящихся в папке ./images. Мы используем метод os.listdir для перечисления всего содержимого каталога, а затем сохраняем его в переменной images, а также сохраняем длину в качестве меры для общего количества доступных изображений.
  2. Затем мы создаем окно изображения определенного размера (360, 360, 3), которое представляет собой трехканальное изображение. Изначально все будет черным (заполнено нулями).
  3. Затем мы определяем еще несколько констант, iк которая будет использоваться для перебора изображений, a чтобы сохранить начальное значение альфа и b для начального значения бета, мы увидим, как они используются для перехода изображения, что в конечном итоге даст эффект слайд-шоу.
  4. Наконец, мы берем первое изображение из списка изображений, изменяем его размер в соответствии с размером окна, это будет первое изображение, которое появится в слайд-шоу.

Цикл слайд-шоу

Создадим слайд-шоу, добавим в тот же файл следующий код:

# Slide Show Loop
while(True):

    if(ceil(a)==0):
        a = 1.0
        b = 0.0
        i = (i+1)%length    # Getting new image from directory
        img = cv2.imread(dst + images[i])
        img = cv2.resize(img, (360, 360))

    a -= 0.01
    b += 0.01

    # Image Transition from one to another
    result = cv2.addWeighted(result, a, img, b, 0)
    cv2.imshow("Slide Show", result)
    key = cv2.waitKey(1) & 0xff
    if key==ord('q'):
        break

cv2.destroyAllWindows()
  1. Теперь мы создаем бесконечный цикл while. Внутри него есть условие, которое проверяет наличие ceil(a), если оно достигает 0 (нуля), затем мы сбрасываем значения a и b, обновляем i круговым способом, используя оператор модуля % по длине списка изображений, чтобы получить индекс следующего изображения, и обновляем переменную img, чтобы содержать новое изображение и изменять его размер.
  2. Вне условия мы используем a и b для уменьшения и увеличения значений альфа и бета соответственно. Этот вариант даст нам эффект перехода, который кажется плавным. Мы будем использовать их с методом cv2.addWeighted, который просто накладывает одно изображение на другое в зависимости от веса данных изображений.
  3. result хранит новое обновленное изображение, которое мы будем отображать с помощью метода cv2.imshow из OpenCV. Наконец, мы ждем ключевого события и выходим из цикла while, если оно произойдет, и уничтожаем все окна, созданные во время выполнения, с помощью метода cv2.destroyAllWindow.

Метод cv2.addWeighted - вот что помогает нам добиться желаемого эффекта слайд-шоу. Здесь значение альфа a - это вес для результирующего изображения (которое изначально было черным окном), а значение бета b - для нового изображения, которое будет перекрывать окно result. Убедитесь, что сумма a и bостается равной 1(единице). Для получения дополнительной информации посетите здесь.

Демо - Как это выглядит

Изображения, которые я сделал, являются логотипами моих любимых языков программирования - Python, Scala и ReactJS (в настоящее время изучаются).

Полный сценарий можно найти здесь.

Что дальше?

Ну вот и все. Если вы следите за этим, вы можете увидеть прекрасное слайд-шоу из своей коллекции изображений. Что касается следующих шагов, вы можете улучшить это приложение, добавив следующее:

  1. Добавьте кнопки для изменения типа слайд-шоу. В настоящее время выполняется только плавный переход, попробуйте реализовать другой анимированный переход.
  2. Добавьте утилиту для выбора нескольких изображений, а не всех, как мы это сделали, мы просто взяли каждое изображение. Кроме того, вы можете попытаться обработать исключение, например, что если из папки поступает не изображение.

Источник:

#Python #OpenCV
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Поделитесь своим опытом, расскажите о новом инструменте, библиотеке или фреймворке. Для этого не обязательно становится постоянным автором.

Попробовать

В подарок 100$ на счет при регистрации

Получить